我幻想着一个工具来检测资源泄漏。我很清楚该工具应该是什么样子以及要求是什么,但我缺少一块拼图来使其工作:当引用超出范围时发生的事件。
该工具的工作方式如下:创建可关闭项时,该工具会围绕它构建一个包装器。当调用 close(( 时,包装器将对象标记为关闭。当对象变为垃圾回收对象时,如果对象尚未关闭,它将提供当前线程的堆栈跟踪,标识我们在代码中放弃对象而不关闭对象的位置。
听起来很漂亮,但我还没有发现引用超出范围时发生的任何事件。有定稿和幻影参考事件,但这些事件发生在不同的线程中,在有罪方已经离开犯罪现场之后。我需要一种类似我可以覆盖的方法的东西,该方法在参考发布时调用。
对我有什么想法吗?
TIA, -提姆。
严格来说,引用不会超出范围。 变量超出范围。 引用是值...并且没有范围。
Java 中没有任何机制允许在包含对象(或管理器(引用的任何引用变量超出范围时收到通知。 最接近的是 try with-resources,当 try 块终止时,它将自动调用已声明资源变量的close()
。 (但这很可能不会帮助您检测您尝试检测的案例。
Java 中没有任何机制允许在对象(或管理器(无法访问时通知它。 有一些机制,如 finalize()
、 PhantomReference
和 Cleaner
(Java 9 中的新功能(可用于检测对象在一段时间前变得无法访问。 但是这些机制依赖于GC,检测通常在无法访问的"事件"之后很长时间内发生,并且它们不会告诉您涉及哪些参考变量。
存储管理不太自动的其他语言确实提供了执行此操作的方法。 但也有缺点。 例如,C++智能指针不会检测到涉及对象周期的情况。