检查垃圾收集器是否可以获取对象


问题内容

有没有一种方法可以检查垃圾收集器是否可以提取对象?

在我的代码中的某个地方,我有一个对象的引用:

MyObject mo = myObject;

然后,通过Eclipse Debugger,获得对象的存储位置。之后,我将引用设置为null:

mo = null;

有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用?

非常感谢,

斯特凡


问题答案:

您无法在运行时使用任意对象执行此操作,实际上,不可能完全确定地执行此操作。但是,有两种选择可能会根据您的需要而适用:

  1. 将引用设置为后,进行堆转储null,然后将其加载到堆分析器工具(如jhat或支持该分析器的探查器)中。这些工具应使您能够从GC根目录遍历路径,从而检查对象是否仍然可以访问。
  2. 将对象包装在给定的PhantomReference中ReferenceQueue。将引用放入队列后,您就知道该对象已被垃圾回收。(不幸的是,如果未对引用进行排队,则可能是因为该对象仍然可以访问,或者可能是因为GC尚未检查该对象。对于所有与GC相关的问题,垃圾回收不是确定性过程! )

总的来说,我同意最好的选择是 了解
内存泄漏问题,并设计应用程序来避免这些问题。如果确实有内存泄漏,那么它应该很明显,然后您就可以将精力集中在发现问题上(再次通过转储并分析堆中无法正确访问的对象)。

上面的步骤比较耗时,不应该在每次更改后都只是为了确保自己而做,而是用来调查 特定 问题的工具。