繁体   English   中英

Java对象能否确定何时对其引用超出范围?

[英]Can a Java object tell when a reference to it goes out of scope?

我正在幻想一种检测资源泄漏的工具。 我有一个很好的主意,该工具的外观和要求是什么,但是我缺乏使它起作用的难题:当引用超出范围时发生的事件。

该工具将按以下方式工作:创建一个closeable时,该工具将在其周围构建包装器。 调用close()时,包装器将对象标记为关闭。 当对象成为垃圾回收对象时,如果尚未关闭该对象,它将传递当前线程的堆栈跟踪,从而确定我们在代码中的哪个位置放弃了该对象而不关闭它。

听起来不错,但是当引用超出范围时,我还没有发现任何事件发生。 有定稿和幻影参考事件,但是在有罪方已经撤离犯罪现场之后,它们发生在不同的线程中。 我需要类似在引用发布时可以覆盖的方法。

对我有什么想法吗?

TIA-蒂姆

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

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM