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

时间:2013-01-26 01:44:10

标签: java garbage-collection

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

一个体系结构涉及引用队列和执行清理的引用队列上的线程阻塞。

现在问题是:如何对所有这些进行测试?

  1. 设置系统
  2. 创建感兴趣的对象
  3. 让它变成垃圾
  4. System.gc()的
  5. 以某种方式等待线程醒来,闻到咖啡,并完成工作
  6. 断言内部计数器被勾选以证明所有这一切都发生了
  7. Thread.sleep()对第5项有效但令人不安。Thread.yield()根本不可靠。还有哪些其他选择?

2 个答案:

答案 0 :(得分:1)

假设您运行的堆小于2GB,分配一个比可用堆大小更小的字节数组应该在抛出预期的OutOfMemoryError之前触发一个立即的完整gc:

byte[] foo = new byte[(int) (Runtime.getRuntime().maxMemory()-1)];

我不会使字节数组大于而不是堆大小,因为VM在这种情况下可能会立即抛出OutOfMemoryError,因为它知道它无论如何都无法提供那么多的堆。

答案 1 :(得分:1)

如果您可以对相关库进行更改,则将可选的BlockingQueue<Reference?>>传递给清理代码,以便它可以指示完成。如果队列存在,则在执行清理后,清理代码会将对队列的引用排入队列。测试代码可以调用BlockingQueue.poll(timeout) - 一旦清理完成就接收引用,或者如果在你确定的某个合理的上限超时时间内没有完成清理,则超时。