有没有办法检查垃圾收集器是否可以获取对象?
在我的代码的某处,我有一个对象的引用:
MyObject mo = myObject;
然后,通过Eclipse Debugger,我得到了对象的内存位置。然后,我将引用设置为null:
mo = null;
有没有办法检查以前引用的对象现在是否适合垃圾回收,或者是否有某个地方引用它?
非常感谢,
的Stefan
答案 0 :(得分:13)
您无法在运行时使用任意对象执行此操作,事实上,确定性地执行此操作并非完全可能。但是,根据您的需要,有两种选择可能适用:
null
后进行堆转储,然后将其加载到堆分析器工具(例如jhat)或支持此问题的分析器中。这些工具应该允许您遍历GC根路径,从而检查您的对象是否仍然可以访问。ReferenceQueue
将对象包裹在PhantomReference中。当引用入队时,您知道该对象已被垃圾回收。 (不幸的是,如果引用未加入,则可能是因为对象仍然可以访问,或者可能是因为GC尚未检查对象。与所有与GC相关的问题一样,垃圾收集不是确定性过程! )总的来说,我同意最好的选择是了解内存泄漏问题并设计应用程序以避免它们。如果你确实有内存泄漏,那么它应该是足够明显的,然后你可以集中精力找到问题(再次通过转储和分析堆不正确的对象)。
上述步骤相对耗时,并且不应该是您在每次更改后执行的操作,只是为了让您放心,而是您用来调查特定问题的工具。
答案 1 :(得分:1)
没有。唯一要做的就是小心并记住编写应用程序时Java中可能存在内存泄漏。
唯一可以做的就是使用工具试图找到当你发现这样的问题时内存泄漏的来源。为此,我强烈建议Memory Analyzer。