Java 垃圾收集问题

Java 垃圾收集问题,java,Java,我有一些类似的代码 class HappyGarbage01 { public static void main(String args[]) { HappyGarbage01 h = new HappyGarbage01(); h.methodA(); /* Line 6 */ } Object methodA() { Object obj1 = new Object(); Object []

我有一些类似的代码

class HappyGarbage01 
{ 
   public static void main(String args[]) 
   {
       HappyGarbage01 h = new HappyGarbage01(); 
       h.methodA(); /* Line 6 */
   } 
   Object methodA() 
   {
       Object obj1 = new Object(); 
       Object [] obj2 = new Object[1]; 
       obj2[0] = obj1; 
       obj1 = null; 
       return obj2[0]; 
   } 
}

垃圾收集器被调用的最大机会是在第9行还是第10行之后?

垃圾收集器不会在第9行之后被调用,因为对
obj1
的引用存储在
obj2[0]
中。对象
obj1
仍然存在于堆上,活动线程可以通过存储在
obj2[0]
中的引用访问该对象


相反,垃圾收集发生在第6行之后。垃圾收集发生在方法返回其对对象的引用之后。方法返回到第6行,没有用于存储返回值的引用。所以答案应该在第6行之后。

您的问题的基本解决方案是:

System.gc();

在适当的位置,您希望调用垃圾收集器,但无法确定垃圾收集器是否将被迫工作。

另一个更复杂的解决方案是使用WeakReference对象。
更多信息,你可以阅读。

希望能有所帮助。

垃圾收集器可能永远不会为该程序运行,因为该程序的寿命不够长。

垃圾收集算法,其中大多数是标记和扫描(在Java中,大多数是标记/扫描),所需时间远远超过一条或几条指令,因此,您不能将它们缩小到一行或两行代码

其次,它们在后台运行,通常(但不总是)在单独的线程上运行,因此它们不会在代码中的特定指令上启动

第三,只有当您的总体内存消耗证明它们运行时,它们才会运行。它们从不运行,因为这里和那里只有几个字节。默认的堆大小大约为256MB,因此示例代码中的几个字节实际上没有什么影响,也没有任何效果

第四,它们的运行只基于内存消耗,而不是对象的可访问性。垃圾收集器无法事先知道可以收集多少内存,只有在它们启动后,它们才会检测到其中一个对象不再可访问


由于所有这些原因,您的问题毫无意义。

只要JVM决定应该运行垃圾收集器,垃圾收集器就会运行。在这个程序中,它可能永远不会运行,因为程序太短了。然而,在大型程序中,它通常会在程序开始使用大量内存时运行


垃圾收集器释放永远无法引用的对象所使用的内存。在本例中,将创建一个对象和一个数组

在整个methodA中,无论是在obj1还是obj2[0]中,都有对对象的引用。然后,返回对它的引用,但该引用被遗忘。因此,只能在methodA返回后收集对象。请注意,如果您在主函数中存储了对它的引用,它将永远不会被垃圾收集,因为您以后可以在主函数中引用它。当程序退出时,操作系统会在释放JVM使用的内存时将其清除


只在函数中保留对数组的引用。因此,当函数结束时,数组将能够执行GC。

当GC运行时,返回的对象不会有任何区别,但GC不太可能触发。垃圾收集有什么问题?你不知道GC什么时候调用。你能给第9行和第10行加上标签并澄清你的问题吗?我不明白你想让我们帮你做什么。你说你在垃圾收集方面有“问题”。你的问题是什么?关于GC,你真正想知道的是什么?我同意@ChristopherSchneider的观点,我们不知道它是否会被调用。但如果你问它是否有资格成为gc,那是另一种情况。它可以在第6行之后运行。但你不能说会的,对吧。更可取的词是“可以”。问题和答案不相关,他问的是gc是否会被调用。@HendrikT实际上我想要一个类似jiltedpotato所说的答案。也许我需要修改这个问题。你能帮我解决这个问题吗?这样我就不必再投反对票了?我不想我的问题毫无用处。
Runtime.gc();