Reference和ReferenceQueue的联动效果

Reference和ReferenceQueue的联动效果使用 new WeakReference(object, ReferenceQueue) 之后,如果object对象被回收,那么WeakReferenc对象将会被添加到ReferenceQueue队列

最近在看LeakCanary原理解析的时候,发现可以创建一个ReferenceQueue队列;

使用 new WeakReference(object, ReferenceQueue) 之后,如果object对象被回收,那么WeakReference这个引用对象将会被添加到ReferenceQueue队列中

为此写个测试代码,记录一下。

public class LeakMemoryTest {
	//创建引用回收队列
	static ReferenceQueue<LeakMemoryTest> queue = new ReferenceQueue<>();
	//弱引用
	static WeakReference<LeakMemoryTest> ref;

	public static void main(String[] args) {
		//测试的回收对象
		LeakMemoryTest t = new LeakMemoryTest();
		//弱引用 关联 测试对象 和 回收队列
		ref = new WeakReference<>(t, queue);
		//日志打印 回收队列
		printQueue(queue);
		//将测试对象 置空, 如果不置空,对象不会被回收,最后引用对象也就不会出现在queue队列中
		t = null;
                System.out.println("release object.");
		Thread thread = new Thread(new Runnable() {
			@Override
			public void run() {
				long millis = 2000L;
				int maxCount = 5;
				int current = 0;
				//判断弱引用中的对象是否被回收
				while (ref.get()!=null&& current < maxCount){
					System.out.println("sleep"+millis+"ms,start gc operation ");
					try {
						Thread.sleep(millis);
					} catch (InterruptedException e) {
						e.printStackTrace();
						break;
					}
					//开始 gc
					System.gc();
					current++;
				}
			}
		});
		thread.start();
		try {
			thread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//日志打印 回收队列
		printQueue(queue);
	}

	private static void printQueue(ReferenceQueue<LeakMemoryTest> queue){
		Reference<? extends LeakMemoryTest> temp;
		System.out.println("\nqueue ↓↓↓↓↓↓↓↓↓↓↓↓↓↓");
		do{
			temp = queue.poll();
			if(temp != null){
				System.out.println("reclaimed object :" + temp.toString()+" , ReferenceQueue object = "+temp.get());
			}
		}
		while (temp!=null);
		System.out.println("queue ↑↑↑↑↑↑↑↑↑↑↑↑↑↑\n");
	}
}

最后运行结果:

queue ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
queue ↑↑↑↑↑↑↑↑↑↑↑↑↑↑

release object.
sleep2000ms,start gc operation

queue ↓↓↓↓↓↓↓↓↓↓↓↓↓↓
reclaimed object :java.lang.ref.WeakReference@15db9742 , ReferenceQueue object = null
queue ↑↑↑↑↑↑↑↑↑↑↑↑↑↑

今天的文章Reference和ReferenceQueue的联动效果分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/16464.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注