java - 为 PhantomReference 应用程序创建可重复的测试

标签 java garbage-collection

考虑一个使用 PhantomReferences 来避免终结器的库,同时确保释放一些 JNI 资源。

一种架构涉及引用队列和阻塞在引用队列上执行清理操作的线程。

现在的问题是:如何对这一切进行测试?

  1. 设置系统
  2. 创建感兴趣的对象
  3. 让它成为垃圾
  4. 系统.gc()
  5. 以某种方式等待线程醒来,闻到咖啡的味道,然后完成工作
  6. 断言内部计数器已被勾选以证明所有这一切都发生了

Thread.sleep() 有效,但对于第 5 项来说令人不安。Thread.yield() 根本不可靠。还有哪些其他选择(如果有)?

最佳答案

如果您可以对相关库进行更改,请传递可选的 BlockingQueue<Reference?>>进入清理代码,以便它可以发出完成信号。如果队列存在,则清理代码在执行清理后将对队列的引用加入队列。测试代码可以调用BlockingQueue.poll(timeout) -- 清理完成后立即接收引用,或者如果清理未在您确定的合理上限超时时间内完成,则超时。

关于java - 为 PhantomReference 应用程序创建可重复的测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14532957/

相关文章:

java - Android DDMS 和分配跟踪 - 确定导致 GC 触发的原因及其原因

c# - 在 list.removeAll 中调用 dispose

c++ - 引用计数垃圾收集

php - 我可以信任调用 PHP __destruct() 方法吗?

Java Apache-poi,excel 文件的内存泄漏

java - 删除列表中的所有非唯一成员

Java 垃圾收集器 - 无法定期正常运行

java - 保护jsp页面反对xss

java - 无法将类型 'java.lang.String' 的值转换为所需的模型对象类型

java - 将元素添加到 LinkedHashMap 中的 ArrayList [Android]