转自http://www.dengchuanhua.com/262.html
1. 支持
fully supported in Oracle JDK 7 update 4
2. Goals
并行和并发: 具有CMS一样的多线程操作能力
压缩:在保持短的停顿时间的基础上尽可能消除碎片
可预测性:GC停顿时间更加可预测
高效:不会对系统吞吐量产生较大影响
节约:GC操作不会浪费太多的heap空间
3. 使用范围
多核,6G以上的heap
4. 概览
Note1. 实际上,各region合起来逻辑上表现为整体的E,S,O,所有对象分散存储在各个region里面;
Note2. 灰色部分表示暂未使用;
Note3. 还有一种类型的region,叫做Humongous regions,用来存储超过一个region50%的大对象,实际上是连续的若干个region的组合。目前G1对大对象的优化比较弱,因此建议避免使用大对象。
Note4. 整个heap会被划分为2000个左右的region,每个region最小为1Mb,最大为32Mb。
Note5. Region和region之间未必是连续的。
5. Young GC
如果当前heap的状态如上,发生YGC的时候,岁数到了一定的对象将会移动到老年代。
最终结果如下:
Note1. 存活的对象会被拷贝到一个新的S区或者O区里面;
Note2. E区和S区的大小在这里将会根据之前的相关信息(例如STW的时间等)进行重新计算;
Note3. 该操作是并发多线程执行的;
Note4. 该操作是STW的。
6. Old GC
阶段
描述
(1)初始化标记(STW)
在此阶段,G1 GC 对根进行标记。该阶段与常规的年轻代垃圾回收密切相关。
(2)根region扫描
在初始标记的存活区扫描对老年代的引用,并标记被引用的对象。该阶段与应用程序(非 STW)同时运行,并且只有完成该阶段后,才能开始下一次 STW 年轻代垃圾回收。
(3)并发标记阶段
G1 GC 在整个堆中查找可访问的(存活的)对象。该阶段与应用程序同时运行,可以被 STW 年轻代垃圾回收中断。
(4)重新标记阶段
该阶段是 STW 回收,帮助完成标记周期。清空 SATB (snapshot-at-the-beginning)区,跟踪未被访问的存活对象,并执行引用处理。
(5)清理阶段
执行统计和 RSet 清理STW 操作。G1会识别完全空闲的区域和可供进行混合垃圾回收的区域。清理阶段在将空白区域重置并返回到空闲列表时,该阶段为部分并发。
(*)拷贝
分散或者拷贝存活的对象到那些没有使用的region。
下面是其一个流程图:
(1) 初始化标记
该阶段附在YGC上,标记那些可能有引用对象的O区
(2) 并发标记阶段
Note1. 活跃度会在该阶段并发计算;
Note2. 该阶段没有清理。
(3) 重新标记阶段(SWT)
如果发现某个region上所有的对象都失效了,他们将会在重新标记阶段直接移除。
(4) 拷贝/清理阶段(SWT)
G1会拷贝找出活跃度最低的那些region,然后和YGC一样做清理
(5) 清理后的结果
7. 使用方式
java -Xmx50m -Xms50m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar c:\javademos\demo\jfc\Java2D\Java2demo.jar
选项和默认值
描述
-XX:+UseG1GC
开启G1
-XX:MaxGCPauseMillis=n
最大GC停顿时间,这是个软目标,JVM将尽可能(但不保证)停顿小于这个时间
-XX:InitiatingHeapOccupancyPercent=n
堆占用了多少的时候就触发GC,默认为45
-XX:NewRatio=n
new/old 比,默认为2
-XX:SurvivorRatio=n
eden/survivor比,默认为8
-XX:MaxTenuringThreshold=n
新生代到老年代的岁数,默认是15
-XX:ParallelGCThreads=n
并行GC的线程数,默认值会根据平台不同而不同
-XX:ConcGCThreads=n
并发GC使用的线程数
-XX:G1ReservePercent=n
设置作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%。
-XX:G1HeapRegionSize=n
设置的 G1 区域的大小。值是2的幂,范围是1 MB 到32 MB。目标是根据最小的 Java 堆大小划分出约 2048 个区域。
8. 最佳实践
年轻代大小:避免使用 -Xmn 选项或 -XX:NewRatio 等其他相关选项显式设置年轻代大小,因为固定年轻代的大小会覆盖暂停时间目标。
暂停时间目标:每当对垃圾回收进行评估或调优时,都会涉及到延迟与吞吐量的权衡。G1是增量垃圾回收器, 其吞吐量目标是 90% 的应用程序时间和 10%的垃圾回收时间。因此,暂停时间目标不要太严苛。目标太过严苛表示您愿意承受更多的垃圾回收开销,而这会直接影响到吞吐量。
掌握混合垃圾回收:当您调优混合垃圾回收时,请尝试以下选项
-XX:InitiatingHeapOccupancyPercent
-XX:G1MixedGCLiveThresholdPercent 和 -XX:G1HeapWastePercent
-XX:G1MixedGCCountTarget 和 -XX:G1OldCSetRegionThresholdPercent
参考: