什么触发垃圾收集

时间:2013-07-05 07:31:30

标签: java garbage-collection

我知道所有垃圾都被收集了。但到底是什么告诉JRE垃圾收集的时候到了?是某种事件还是时间间隔?

6 个答案:

答案 0 :(得分:6)

HotSpot的垃圾收集已经发展成为一项非常复杂的业务,甚至其创建者也难以全面了解。因此,你不能给出一个简单的答案;一些触发器是:

  1. 占用每个对象生成达到阈值;
  2. 特定代中的内存分配请求失败;
  3. 整体堆占用达到阈值。
  4. 请注意,您甚至没有指定您感兴趣的垃圾收集的:有次要集合和主要收集,在技术上他们是非常不同的。您还没有指定您想到的垃圾收集器:HotSpot有四个可供选择。

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

答案 1 :(得分:0)

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

JVM有不同的实现,包括可以在不同模式下运行的GC,并且具有通常非常好的非常复杂的算法,如果你有特殊用法(或特殊事件,比如重启后)一个平台) - 你可以调整它using flags(如:最小堆大小,最大堆大小等),但即使不这样做,GC也会收集具有空引用的对象(指向它们的指针)。需要从堆中释放内存。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为好的做法并不完全取决于GC,请参阅THISTHIS

答案 4 :(得分:0)

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

但是JVM的这种行为无法保证,可以从java程序中请求GC发生,但不能保证JVM会对此请求进行处理。

答案 5 :(得分:0)

JVM认为它需要基于Java heap size的垃圾收集时,就会发生java中的垃圾收集。

但您可以使用

强制GC收集垃圾
System.gc () 

Runtime.gc () 

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

了解详情:http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html#ixzz2Y9gKzQE1