`
supben
  • 浏览: 326473 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

强引用,软引用,弱引用,虚引用

    博客分类:
  • JVM
阅读更多
测试对象
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中只有一个对象运行的情况下得到的。
1
1
分享到:
评论
2 楼 yin520liang 2014-11-04  
WeakReference<Obj> weak = new WeakReference<Obj>(new Obj("soft"));  写错了~
1 楼 rxin2009 2012-11-01  
学习了,但是这里有两个问题想请教下:
1、第五条中是不是应该是1和3的打印结果呢,还是我的理解错了?
2、第六条中,app中有多个对象运行有什么区别吗?

相关推荐

Global site tag (gtag.js) - Google Analytics