引用队列使用时遇到的一个大坑

Posted 技术无产者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引用队列使用时遇到的一个大坑相关的知识,希望对你有一定的参考价值。

当我使用弱引用时希望通过引用队列来回收弱引用对象发现引用队列怎么都获取不到回收的弱引用对象,如下:


/**
 * @author: @zyz
 */
public class ReferenceTest6 
	private static final int _4MB = 4 * 1024 * 1024;

	public static void main(String[] args) throws InterruptedException 

		// 引用队列
		ReferenceQueue<byte[]> queue = new ReferenceQueue<>();

		WeakReference <byte[]> ref = new WeakReference<>(new byte[_4MB], queue);
		WeakReference <byte[]> ref1 = new WeakReference<>(new byte[_4MB], queue);
		WeakReference <byte[]> ref2 = new WeakReference<>(new byte[_4MB], queue);

		System.gc ();




		Reference<? extends byte[]> poll = queue.poll();
		while( poll != null) 
			System.out.println ("回收");
			poll = queue.poll();
		



	



// 结果为什么都不输出

经过各种查资料最终发现,当你调用System.gc()时, 只是告诉gc进行一次回收动作,但是回收什么还是由gc自己决定的,通过以下代码证明:


/**
 * @author: @zyz
 */
public class ReferenceTest6 
	private static final int _4MB = 4 * 1024 * 1024;

	public static void main(String[] args) throws InterruptedException 

//		-Xmx10m -XX:+DisableExplicitGC
		// 引用队列
		ReferenceQueue<byte[]> queue = new ReferenceQueue<>();

		WeakReference <byte[]> ref = new WeakReference<>(new byte[_4MB], queue);
		WeakReference <byte[]> ref1 = new WeakReference<>(new byte[_4MB], queue);
		WeakReference <byte[]> ref2 = new WeakReference<>(new byte[_4MB], queue);

		System.gc ();



		// 从队列中获取无用的 软引用对象,并移除
		Reference<? extends byte[]> poll = queue.poll();
		while( poll != null) 
			System.out.println ("回收");
			poll = queue.poll();
		
		System.out.println ("等待GC");
	Thread.sleep (2000);

			poll = queue.poll();
			while( poll != null) 
				System.out.println ("回收");
			poll = queue.poll();
			


	



//结果: 
// 等待GC
// 回收
// 回收
// 回收

以上是关于引用队列使用时遇到的一个大坑的主要内容,如果未能解决你的问题,请参考以下文章

解决未能加载文件或程序集“Newtonsoft.Json ...."或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)(代码片段

引用向量的部分片段?

Android Studio:膨胀类片段时出错

# Java 常用代码片段

# Java 常用代码片段

Android App 在片段中创建 ListView 引用时关闭