Java 对象能否判断对它的引用何时超出范围



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

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

听起来很漂亮,但我还没有发现引用超出范围时发生的任何事件。有定稿和幻影参考事件,但这些事件发生在不同的线程中,在有罪方已经离开犯罪现场之后。我需要一种类似我可以覆盖的方法的东西,该方法在参考发布时调用。

对我有什么想法吗?

TIA, -提姆。

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

Java 中没有任何机制允许在包含对象(或管理器(引用的任何引用变量超出范围收到通知。 最接近的是 try with-resources,当 try 块终止时,它将自动调用已声明资源变量的close()。 (但这很可能不会帮助您检测您尝试检测的案例。

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


存储管理不太自动的其他语言确实提供了执行此操作的方法。 但也有缺点。 例如,C++智能指针不会检测到涉及对象周期的情况。

相关内容

  • 没有找到相关文章

最新更新