强引用(StrongReference)
最常见的引用方式
A a = new A();
这就是强引用,如果一个对象是一个强引用,那么JVM在这个对象在虚拟机栈中的时候绝对不会回收这个对象,就算抛出OOM挂掉程序,也不会进行回收
但是这种情况
public class Test {
public static void main(String[] args) {
new Test().fun1();
}
public void fun1() {
Object object = new Object();
Object[] objArr = new Object[1000];
}
}
当fun1方法在虚拟机栈中出栈后,对应的对象就回在某个时候被JVM回收
软引用(SoftReference)
SoftReference<String> softReference = new SoftReference<>(new String("Hello SoftReference"));
通过SoftReference创建的对象就是一个弱引用
只要JVM内存充足,无论发生多少次GC,软引用只想的对象都不会被回收,但是如果JVM内存满了,就会被回收
软引用如果没有被回收,就可以一直被访问
弱引用(WeakReference)
WeakReference<String> weakReference = new WeakReference<>(new String("Hello WeakReference"));
通过WeakReference创建的对象就是一个弱引用
只有进行了垃圾回收,弱引用的对象就会被回收,弱引用生命周期最长就是两次GC的间隔时间
虚引用(PhantomReference)
ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
PhantomReference<String> phantomReference = new PhantomReference<>(new String("Hello PhantomReference"), referenceQueue);
虚引用的创建多了一个依赖的队列,无法通过虚引用获取对象
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期。如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收
虚引用一般来检测对象是否被回收
无法通过虚引用获取对象
参考文章