2

我知道什么都会被垃圾收集。但是究竟是什么告诉 JRE 现在是垃圾收集的时候了?它像某个事件或时间间隔吗?

4

6 回答 6

7

HotSpot 的垃圾收集已经发展成为一项极其复杂的业务,即使是其创建者也难以完全理解。因此不能给你一个简单的答案;一些触发器是:

  1. 每个对象代的占用达到阈值;
  2. 特定代中的内存分配请求失败;
  3. 整体堆占用达到阈值。

请注意,您甚至没有指定您对哪种垃圾收集感兴趣:有次要收集和主要收集,并且在技术上它们非常不同。您还没有指定您想到的垃圾收集器:HotSpot 有四个可供选择。

如果您是 Java 初学者,最好的建议是 a) 在日常编程中,不要担心;b)如果你想学习,你必须深入挖掘

于 2013-07-05T07:36:54.487 回答
0

您可以使用System.gc();,但不能保证它会运行(它只是“建议”GC 运行)。

JVM 有不同的实现,包括可以在不同模式下运行的 GC,并且有非常复杂的算法,通常工作得很好,也就是说,如果你有特殊用途(或特殊事件,比如重新启动平台后) - 您可以使用标志来调整它(例如:最小堆大小、最大堆大小等),但即使不这样做,GC 也会在需要释放内存时收集具有空引用的对象(指向它们的指针)堆。

于 2013-07-05T07:36:05.373 回答
0

对象有空引用,那么它将被垃圾收集。但是 GC 不会像完成时那样提供保证。

于 2013-07-05T07:36:14.253 回答
0

我认为一个好的做法并不完全依赖于 GC,请参阅THISTHIS

于 2013-07-05T07:36:38.423 回答
0

JVM认为它需要基于 Java堆大小的垃圾收集时,Java 中的垃圾收集就会发生。

但是你可以强制 GC 收集垃圾使用

System.gc () 

或者

Runtime.gc () 

但不能保证垃圾收集会发生。

阅读更多:http: //javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2Y9gKzQE1

于 2013-07-05T07:48:06.693 回答
0

JVM 控制垃圾收集器,它决定何时运行垃圾收集器。当它意识到内存不足或当没有活动线程可以访问对象时,它会运行 GC。

但是不能保证 JVM 的这种行为,可以从 java 程序中请求 GC,但不能保证这个请求会被 JVM 处理。

于 2013-07-05T07:38:48.997 回答