目录
今天聊聊这四个引用~
强引用
当new 一个对象的时候变量对这个对象的引用就是强引用,即在这个栈帧的范围内,这个对象不会被回收
public class Test {
public static void main(String[] args) {
Object o = new Object();
}
}
图中就是一个强引用,只要这个main线程没有结束,这个对象就不会被垃圾回收。
软引用
当对象被SoftReference包装之后,对这个对象的引用为软引用,如下:
public class Test {
public static void main(String[] args) {
SoftReference<Object> soft = new SoftReference<>(new Object());
}
}
当堆内存不足时,gc时会先将软引用的对象(即代码中new出来的Object对象)进行回收,如果堆内存还是不够用,老年代已经满了还有新的对象进入老年代时,才会发生OOM(内存溢出)。
如果要从soft中获取这个对象,可以使用soft.get()方法获取,当然当这个对象被回收之后,get方法返回为null
弱引用
当对象被WeakReference包装之后,对这个对象的引用为弱引用,如下:
public class Test {
public static void main(String[] args) {
WeakReference<Object> weakReference = new WeakReference<>(new Object());
}
}
这个引用比软引用更弱,当创建完这个对象之后,如果遇到gc,这个对象就会被回收。所以这个对象的生命周期是被创建开始到遇到一次gc,存活时间相对于软引用更短,同样可以通过get方法获取对象
虚引用
当对象被PhantomReference包装之后,对这个对象的引用为虚引用,如下:
public class Test {
public static void main(String[] args) {
ReferenceQueue<Object> q = new ReferenceQueue();
PhantomReference<Object> phantomReference = new PhantomReference<>(new Object(), q);
System.out.println(phantomReference.get());
// 主动建议触发一次gc
System.gc();
System.out.println(phantomReference.get());
System.out.println(q.poll());
}
}
虚引用要搭配Reference队列使用,无论在什么时候,通过phantomReference.get方法都无法获取到这个对象,发生一次gc后,这个对象会被放入队列中,此时q.poll的返回值为这个对象
开发入门中,欢迎指教~