强引述,软引用,弱引用,虚引用
强引用,软引用,弱引用,虚引用
测试对象
测试类
测试环境:jdk1.6。
System.gc()表示建议JVM 进行垃圾回收,JVM 未必会执行。我们可以根据 thinking in java说的那样,用finalize()来监控他的执行。
上面4个方法的运行结果分别是
1.null
执行finalize方法hard
或者
执行finalize方法hard
null
两者出现的比例大约为5:1
2.soft
3.null
执行finalize方法weak
或者
执行finalize方法weak
null
两者出现的比例大约为3:1
4.null
结论:1.显式的把(强引用)对象置为null,会大大加大 垃圾回收执行频率。几乎只要我们给出建议,jvm就会回收。
2.对于软引用,如果不显式的置为null的话,和强引用差不多,垃圾回收不会执行。只会等到内存不足的时候才会执行。
3.对于弱引用,就算你不显式的把他置为null,垃圾回收也会立即执行。
4.虚引用,相当于null,不解释。
5.垃圾回收执行的时机是不可预知的。3和4的打印结果很好的说明了这点。
6.务必要注意到一个事实,本例子的结果是在app中只有一个对象运行的情况下得到的。
测试对象
public class Obj { private final String name; public Obj(String name) { this.name = name; } @Override protected void finalize() throws Throwable { System.out.println("执行finalize方法" + name); super.finalize(); } @Override public String toString() { return name; } }
测试类
import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; public class Test { public static void main(String[] args) { // hardTest(); softTest(); // weakTest(); // phanTest(); } public static void hardTest() { Obj hard = new Obj("hard"); hard = null; System.gc(); System.out.println(hard); } public static void softTest() { SoftReference<Obj> soft = new SoftReference<Obj>(new Obj("soft")); System.gc(); System.out.println(soft.get()); } public static void weakTest() { WeakReference<Obj> weak = new WeakReference<Obj>(new Obj("soft")); System.gc(); System.out.println(weak.get()); } public static void phanTest() { ReferenceQueue<Obj> rq = new ReferenceQueue<Obj>(); PhantomReference<Obj> phan = new PhantomReference<Obj>(new Obj("phan"), rq); //这里没有调用system.gc(); System.out.println(phan.get()); } }
测试环境:jdk1.6。
System.gc()表示建议JVM 进行垃圾回收,JVM 未必会执行。我们可以根据 thinking in java说的那样,用finalize()来监控他的执行。
上面4个方法的运行结果分别是
1.null
执行finalize方法hard
或者
执行finalize方法hard
null
两者出现的比例大约为5:1
2.soft
3.null
执行finalize方法weak
或者
执行finalize方法weak
null
两者出现的比例大约为3:1
4.null
结论:1.显式的把(强引用)对象置为null,会大大加大 垃圾回收执行频率。几乎只要我们给出建议,jvm就会回收。
2.对于软引用,如果不显式的置为null的话,和强引用差不多,垃圾回收不会执行。只会等到内存不足的时候才会执行。
3.对于弱引用,就算你不显式的把他置为null,垃圾回收也会立即执行。
4.虚引用,相当于null,不解释。
5.垃圾回收执行的时机是不可预知的。3和4的打印结果很好的说明了这点。
6.务必要注意到一个事实,本例子的结果是在app中只有一个对象运行的情况下得到的。