实战Java虚拟机之三:“G1的新生代GC”

今天开始实战Java虚拟机之三:“G1的新生代GC”。jvm

总计有5个系列spa

    新生代GC的主要工做是回收eden区和survivor区。一旦eden区被占满,新生代GC就会启动。新生代GC收集先后的堆数据如图5.6所示,其中E表示eden区,S表示survivor区,O表示老年代。能够看到,新生代GC只处理eden和survivor区,回收后,全部的eden区都应该被清空,而survivor区会被收集一部分数据,可是应该至少仍然存在一个survivor区,类比其余的新生代收集器,这一点彷佛并无太大变化。另外一个重要的变化是老年代的区域增多,由于部分survivor区或者eden区的对象可能会晋升到老年代。ci

5-6

图5.6  G1的新生代GCget

新生代GC发生后,若是打开了PrintGCDetails选项,就能够获得相似如下的GC日志(这里只给出了部分日志,彻底的日志及其分析请看《实战Java虚拟机》一书第5.4.6节):虚拟机

1
2
3
4
5
6
7
0.336 : [GC pause (young),  0.0063051  secs]
 
….
 
    [Eden:  235 .0M( 235 .0M)-> 0 .0B( 229 .0M) Survivors:  5120 .0K-> 11 .0M Heap:  239 .2M( 400 .0M)-> 10 .5M( 400 .0M)]
 
  [Times: user= 0.06  sys= 0.00 , real= 0.01  secs]

    和其余回收器的日志相比,G1的日志内容很是丰富。固然咱们最为关心的依然是GC的停顿时间以及回收状况。从日志中能够看到,eden区本来占用235M空间,回收后被清空,survivor区从5M增加到了11M,这是由于部分对象从eden区复制到survivor区,整个堆合计为400M,从回收前的239M降低到10.5M。

 

实战Java虚拟机之一“堆溢出处理”

实战Java虚拟机之二“虚拟机的工做模式”

节选自

25612fm立体图

《实战Java虚拟机》一书Q交流群:397196583

相关文章
相关标签/搜索