携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第46天,点击查看活动详情
- Young GC
Young GC是stop-the-world活动,会导致整个应用线程的停止。其过程如下:
- 新对象进入Eden区
- 存活对象拷贝到Survivor区;
- 存活时间达到年龄阈值时,对象晋升到Old区。 young gc是多线程并行执行的。
- Old GC阶段描述为:
- 初始化标记(stop_the_world事件):这是一个stop_the_world的过程,是随着年轻代GC做的,标记survivor区域(根区域),这些区域可能含有对老年代对象的引用。
- 根区域扫描:扫描survivor区域中对老年代的引用,这个过程和应用程序一起执行的,这个阶段必须在年轻代GC发生之前完成。
- 并发标记:查找整个堆中存活的对象,这也是和应用程序一起执行的。这个阶段可以被年轻代的垃圾收集打断。
- 重新标记(stop-the-world事件):完成堆内存活对象的标记。使用了一个叫开始前快照snapshot-at-the-beginning (SATB)的算法,这个会比CMS collector使用的算法快。
- 清理(stop-the-world事件,并且是并发的):对存活的对象和完全空的区域进行统计(stop-the-world)、刷新Remembered Sets(stop-the-world)、重置空的区域,把他们放到free列表(并发)(译者注:大体意思就是统计下哪些区域又空了,可以拿去重新分配了)
- 复制(stop-the-world事件):这个stop-the-world的阶段是来移动和复制存活对象到一个未被使用的区域,这个可以是年轻代区域,打日志的话就标记为 [GC pause (young)]。或者老年代和年轻代都用到了,打日志就会标记为[GC Pause (mixed)]。
-
- 参数分析
-XX:+UseG1GC使用G1 GC -XX:MaxGCPauseMillis=n设置一个暂停时间期望目标,这是一个软目标,JVM会近可能的保证这个目标 -XX:InitiatingHeapOccupancyPercent=n内存占用达到整个堆百分之多少的时候开启一个GC周期,G1 GC会根据整个栈的占用,而不是某个代的占用情况去触发一个并发GC周期,0表示一直在GC,默认值是45 -XX:NewRatio=n年轻代和老年代大小的比例,默认是2 -XX:SurvivorRatio=n eden和survivor区域空间大小的比例,默认是8 -XX:MaxTenuringThreshold=n晋升的阈值,默认是15(译者注:一个存活对象经历多少次GC周期之后晋升到老年代) -XX:ParallelGCThreads=n GC在并行处理阶段试验多少个线程,默认值和平台有关。(译者注:和程序一起跑的时候,使用多少个线程) -XX:ConcGCThreads=n并发收集的时候使用多少个线程,默认值和平台有关。(译者注:stop-the-world的时候,并发处理的时候使用多少个线程) -XX:G1ReservePercent=n预留多少内存,防止晋升失败的情况,默认值是10 -XX:G1HeapRegionSize=n G1 GC的堆内存会分割成均匀大小的区域,这个值设置每个划分区域的大小,这个值的默认值是根据堆的大小决定的。最小值是1Mb,最大值是32Mb