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

标签 java reference resource-leak

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

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

听起来不错,但我还没有发现当引用超出范围时会发生任何事件。有终结事件和幻象引用事件,但这些事件发生在不同的线程中,在犯罪方已经离开犯罪现场之后。我需要类似可以重写的方法之类的方法,该方法在引用版本上调用。

有什么想法给我吗?

TIA, - 蒂姆。

最佳答案

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

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

Java 中没有任何机制可以让对象(或管理器)在无法访问时得到通知。有一些机制,例如 finalize()PhantomReferenceCleaner(Java 9 中的新增功能)可用于检测对象 < em> 早些时候已变得无法访问。但这些机制依赖于 GC,并且检测通常在变得无法访问的“事件”发生后很长一段时间内发生,并且它们不会告诉您涉及哪些引用变量。

<小时/>

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

关于java - Java 对象能否判断对它的引用何时超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35406286/

相关文章:

java - JOOQ多字段自定义类型转换器

java - 如果未正确完成 RestEasyClient JAX RS 可能会出现资源泄漏

c - 即使在 pthread_detach 之后也会出现泄漏

javascript - 将值从函数内部传递给 JavaScript 中的参数

javascript - Uncaught ReferenceError : "changing" is not defined (JavaScript)

python - 异步上下文管理器是否需要保护它们的清理代码不被取消?

Java 泛型类型

java - Java 有没有办法将数字作为参数传递?

Java : How to create map using the class attributes?

C++:在这种情况下引用的优势是什么?