FAQ about Java GC

1. 为什么在进行Full GC之前最好进行一次Minor GC?
Garbage collecting the young generation space prior to garbage collecting the old generation space usually results in less work for the garbage collector and more objects being garbage collected since objects in the old generation space may be holding object references to objects in the young generation space. If the young generation space is not garbage collected, any object in old generation space that holds a reference to an object in young generation space cannot be garbage collected.

2. 什么时候触发GC?

GC分为Full GC 跟Minor GC ,当每一块区满的时候都会引发GC.

Minor GC 

一般情况下,当新对象生成,并且在Eden申请空间失败时,就触发了MinorGC 对Eden区域进行GC,清除非存活对象,把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。

Full GC 

对整个堆进行整理,包括Young、Tenured和Perm。Full GC比Scavenge GC要慢,因此应该尽可能减少Full GC。有如下原因可能导致Full GC:

  • Tenured被写满
  • Perm域被写满
  • System.gc()被显示调用

上一次GC之后Heap的各域分配策略动态变化

注意:

1. eden 满了会GC

2. 当前的old generation满了也会GC,若果GC后还是不够,就扩展,但是不是所有GC算法都是满的时候再GC,CMS垃圾收集器是68%的时候触发GC,因为它进行GC的时候也需要消耗内存.

3.对象申请失败的时候也会进行GC,而且总是minorGC在fullGC前面.

posted @ 2014-10-07 15:44  princessd8251  阅读(158)  评论(0)    收藏  举报