强引用,弱引用,软引用,虚引用
强引用
就算调用GC,强引用不能被回收
class ClassA{
/**
* 对象在销毁前会检测对象中有没有重写finalize方法,有的话会
* 先调用finalize()方法。
* @throws Throwable
*/
@Override
protected void finalize() throws Throwable {
System.out.println("finalize()");
}
}
public class TestReference01 {
public static void main(String[] args) {
//o1为ClassA对象实例的强引用
ClassA o1 = new ClassA();
System.gc();
}
}
弱引用
手动触发gc会被回收,触发自动触发gc,也会回收弱引用。
设置内存大小: -Xms5m -Xmx5m -XX:+PrintGCDetails
WeakReference<ClassA> wr = new WeakReference<>(new ClassA());
软引用
只有在内存不足时,才会被gc回收
SoftReference<ClassA> wr = new SoftReference<>(new ClassA());
虚引用
PhantomReference虚引用其实就是强引用,当内存不足的时候,JVM不会自动释放堆对象占用的内存。