Java对象可以告诉它何时超出范围?

时间:2016-02-15 09:58:15

标签: java reference resource-leak

我想要一种检测资源泄漏的工具。我很清楚该工具应该是什么样子以及需求是什么,但我缺少一个难题来使其工作:当引用超出范围时发生的事件。

该工具的工作方式如下:创建closeable时,该工具会围绕它构建一个包装器。当调用close()时,包装器将对象标记为关闭。当对象变为垃圾收集时,如果对象尚未关闭,它将传递当前线程的堆栈跟踪,识别代码中我们放弃对象的位置,而不关闭它。

听起来很漂亮,但我没有发现引用超出范围时发生的任何事件。有终结和幻影参考事件,但这些事件发生在一个不同的线程,在有罪的一方已经腾出犯罪现场。我需要的东西就像我可以覆盖的方法,在引用版本上调用。

对我有什么想法?

TIA,      - 蒂姆。

1 个答案:

答案 0 :(得分:1)

严格来说,引用不会超出范围。变量超出范围。引用是值...并且没有范围。

在Java中,没有任何机制可以在 包含其引用的任何引用变量超出范围时通知对象(或管理器)。最接近的是 try-with-resources ,它将在try块终止时自动在声明的 resource 变量上调用close()。 (但这很可能无法帮助您发现您要检测的案件。)

Java中没有机制允许无法访问时通知对象(或管理器)。 finalize()PhantomReferenceCleaner(Java 9中的新功能)等机制可用于检测某个对象变得无法访问一段时间。较早。但是这些机制依赖于GC,并且检测通常在“事件”变得不可达之后很长时间发生,并且它们不会告诉您涉及哪些参考变量。


其他存储管理自动化程度较低的语言也提供了实现此目的的方法。但是也有一个缺点。例如,C ++智能指针将无法检测到涉及对象循环的情况。