有没有办法检查垃圾收集器是否可以获取对象?
在我的代码中的某个地方,我得到了一个对象的引用:
MyObject mo = myObject;
然后,通过 Eclipse Debugger,我获得了对象的内存位置。之后,我将引用设置为空:
mo = null;
有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用指向它?
非常感谢,
斯特凡
最佳答案
您不能在运行时对任意对象执行此操作,事实上,完全不可能确定性地执行此操作。但是,根据您的需要,有两个选项可能适合:
- 将引用设置为
null
后进行堆转储,然后将其加载到堆分析器工具中,例如jhat。或支持此功能的分析器。这些工具应该可以让您遍历从 GC 根开始的路径,从而检查您的对象是否仍然可以访问。 - 将对象包裹在 PhantomReference 中使用给定的
ReferenceQueue
。当引用入队时,您就知道该对象已被垃圾回收。 (不幸的是,如果引用未排队,可能是因为对象仍然可以访问,或者可能是因为 GC 尚未检查对象。与所有 GC 相关的问题一样,垃圾收集不是一个确定性过程! )
但总的来说,我同意最好的选择是意识到内存泄漏问题并设计您的应用程序以避免它们。如果您确实有内存泄漏,它应该足够明显,然后您可以将精力集中在查找问题上(再次通过转储和分析无法正确访问的对象的堆)。
上述步骤相对耗时,不应该是您在每次更改后为了让自己放心而做的事情,而是您用来调查特定问题的工具。
关于java - 检查垃圾收集器是否可以获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4223956/