Java中引用存储的是对一块内存地址的起始地址。除此之外,jdk另外还提供了四种引用:强引用、软引用、弱引用、虚引用来分别表示不同场景下回收的引用,更加丰富。
一、强引用
强引用是我们平时使用最多的引用,通过“obj = new Object()”这种创建的就是强引用。只要强引用还存在,垃圾回收器就不会回收这个引用。
何时会回收强引用呢?
1.手工置为null,jvm进行垃圾回收。
2.对象生存期到了。比如方法内的局部变量在退出方法后,jvm进行垃圾回收。
public class MyObject {
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("被回收");
}
}
1.强引用显示回收:
public void testRefrence(){
MyObject obj = new MyObject();
System.out.println(obj);
obj = null;
System.out.println(obj);
System.gc();
}
运行结果:
com.yannic.road.service.MyObject@17579e0f
null
被回收
虽然obj置为null了,但是jvm没有进行垃圾回收,所以此时还没有回收掉这个强引用。
2.强引用隐式回收
/**
* 为了消耗大量内存,触发jvm垃圾回收
*/
public void drainMemory(){
String[] array = new String[1024 * 100];
for(int i = 0; i < 1024 * 100; i++) {
for(int j = 'a'; j <= 'z'; j++) {
array[i] += (char)j;
}
}
}
public void methodA(){
MyObject obj = new MyObject();
}
@Test
public void testRefrence(){
methodA();
//触发jvm垃圾回收
drainMemory();
}
运行结果:
被回收
obj在方法退出后,就不再指向new MyObject()所在的内存了。
二、软引用
软引用是只有jvm内存不够时,才会被垃圾回收。也就是内存足够时,和强引用是一样的。
MyObject obj = new MyObject();
SoftReference reference = new SoftReference(obj);
软引用一般用于对于内存敏感的场景。
三、弱引用
弱引用就是不管内存是否足够,只要发生垃圾回收,弱引用就会被回收。
public void testRefrence(){
MyObject obj = new MyObject();
WeakReference reference = new WeakReference(obj);
obj = null;
System.gc();
}
运行结果:
被回收
弱引用适用于那些临时需要缓存的数据,一旦内存不够被回收也没有什么影响。
四、虚引用
虚引用就是无引用,使对象无引用。
public void testRefrence(){
MyObject obj = new MyObject();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference ref = new PhantomReference(obj, queue);
}
网友评论