今天开始实战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 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虚拟机》一书Q交流群:397196583