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

Java 检查垃圾收集器是否可以提取对象,java,garbage-collection,Java,Garbage Collection,有没有办法检查垃圾收集器是否可以提取对象 在我的代码中,我有一个对象的引用: MyObject mo = myObject; 然后,通过Eclipse调试器,我获得对象的内存位置。之后,我将引用设置为null: mo = null; 有没有办法检查以前引用的对象现在是否适合进行垃圾收集,或者是否有其他引用 非常感谢 Stefan不是。唯一要做的就是要小心,并记住,在编写应用程序时,Java中可能存在内存泄漏 你唯一能做的就是,当你注意到这样一个问题时,使用工具试图找出内存泄漏的来源。我强烈建

有没有办法检查垃圾收集器是否可以提取对象

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

MyObject mo = myObject;
然后,通过Eclipse调试器,我获得对象的内存位置。之后,我将引用设置为null:

mo = null;
有没有办法检查以前引用的对象现在是否适合进行垃圾收集,或者是否有其他引用

非常感谢


Stefan

不是。唯一要做的就是要小心,并记住,在编写应用程序时,Java中可能存在内存泄漏


你唯一能做的就是,当你注意到这样一个问题时,使用工具试图找出内存泄漏的来源。我强烈建议您这样做。

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

  • 在将引用设置为
    null
    后,获取堆转储,然后将其加载到堆分析器工具(如或支持此功能的分析器)中。这些工具应该允许您从GC根遍历路径,从而检查对象是否仍然可以访问
  • 使用给定的
    引用队列
    将对象包装在一个队列中。当引用排队时,您知道对象已被垃圾收集。(不幸的是,如果引用未排队,可能是因为对象仍然可以访问,也可能是因为GC尚未检查对象。与所有与GC相关的问题一样,垃圾收集不是一个确定的过程!)
  • 但总的来说,我同意最好的选择是注意内存泄漏问题,并设计应用程序以避免它们。如果确实存在内存泄漏,那么应该足够明显,然后可以集中精力查找问题(再次通过转储和分析堆以查找无法正确访问的对象)


    上面的步骤相对来说比较耗时,而且不应该是每次更改后只是为了让自己放心而做的事情,而应该是用来调查特定问题的工具。

    这是一个Huuuge应用程序,我们遇到了内存问题。一个优化现在应该会带来改进,但不如我们预期的那么多。因此,我们想知道特定对象是否被垃圾收集。谢谢你的回复,我会试试的!正确你会得到一个纯粹的垃圾:谢谢你的回复!当然,谨慎是最重要的,但有时这是不够的或不可能的(见安德烈·道尔的答案)