考虑使用PhantomReferences来避免终结器的库,同时确保释放一些JNI资源。
一个体系结构涉及引用队列和执行清理的引用队列上的线程阻塞。
现在问题是:如何对所有这些进行测试?
Thread.sleep()
对第5项有效但令人不安。Thread.yield()
根本不可靠。还有哪些其他选择?
答案 0 :(得分:1)
假设您运行的堆小于2GB,分配一个比可用堆大小更小的字节数组应该在抛出预期的OutOfMemoryError之前触发一个立即的完整gc:
byte[] foo = new byte[(int) (Runtime.getRuntime().maxMemory()-1)];
我不会使字节数组大于而不是堆大小,因为VM在这种情况下可能会立即抛出OutOfMemoryError,因为它知道它无论如何都无法提供那么多的堆。
答案 1 :(得分:1)
如果您可以对相关库进行更改,则将可选的BlockingQueue<Reference?>>
传递给清理代码,以便它可以指示完成。如果队列存在,则在执行清理后,清理代码会将对队列的引用排入队列。测试代码可以调用BlockingQueue.poll(timeout)
- 一旦清理完成就接收引用,或者如果在你确定的某个合理的上限超时时间内没有完成清理,则超时。