CMS GC 并发标记清除算法

打印日志信息

-verbose:gc
-XX:+PrintGCDetails                                 ## 输出GC详细日志
-XX:+PrintGCTimeStamps                              ## 输出GC的时间戳(以基准时间的形式)
-XX:+PrintHeapAtGC                                  ## 在进行GC的前后打印出堆的信息
-XX:+PrintGCApplicationConcurrentTime               ## 输出GC之间运行了多少时间
-XX:+PrintTenuringDistribution                      ## 参数观察各个Age的对象总大小
-XX:+PrintGCApplicationStoppedTime                  ## GC造成应用暂停的时间

CMS主要配置参数:

以下大多数参数都可以直接使用,需要调整优化的参数有 -Xmn 和 -XX:SurvivorRatio。建议参数设置为:

  • -XX:SurvivorRatio = 2
  • -Xmn随着Java分配的对内存增大而增大,取值范围通常为1~3G;如:-Xmx <= 16G,-Xmn = 512M;16G < -Xmx <= 32G,-Xmn = 1G;32G < -Xmx <= 64G,-Xmn = 2G
-Xms30g                                ## 初始化堆内存大小
-Xmx30g                                ## 堆内存最大值
-Xmn1g                                 ## 年轻代内存大小,整个JVM内存=年轻代+年老代+持久代
-Xss256k                               ## 设置每个线程的堆栈大小
-XX:MaxPermSize=256m                   ## 最大持久代内存大小
-XX:SurvivorRatio=2                    ## 新生代Eden和Survivor(From幸存区或To幸存区)的比例,
                                       ## 默认为8,Eden占8/10,From和To幸存区各占1/10
-XX:MaxTenuringThreshold=15            ## 新生代需要经历多少次GC晋升到老年代中的最大阈值
-XX:CMSInitiatingOccupancyFraction=75  ## 使用cms作为垃圾回收使用75%后开始CMS收集
-XX:+UseParNewGC                       ## 对年轻代采用多线程并行回收,这样收得快
-XX:+UseConcMarkSweepGC                ## 并发标记清除(CMS)收集器
-XX:+CMSParallelRemarkEnabled          ## 启用并行标记,降低标记停顿
-XX:+UseCMSInitiatingOccupancyOnly     ## 使用设定的回收阈值,开始CMS收集,
                                       ## 如果不指定,JVM仅在第一次使用设定值,后续则自动调整
-XX:+UseCMSCompactAtFullCollection     ## 在FULL GC的时候对年老代的压缩,stop the world
                                       ## 消除内存碎片,停顿时间加长
-XX:+DisableExplicitGC                 ## 忽略手动调用GC, System.gc()不触发GC

 CMS回收原理:

首先CMS发生在老年代,触发CMS发生的有两种情况,一种是年轻代对象往老年代拷贝的时候,发现老年代无法分配一块合适大小的连续内存;另一种是统计多次STW时间,发现GC时间占比较大。CMS会通过多线程并发标记可回收的内存块,在回收过程中不会移动被引用的对象。因此GC之后,存活的对象是散落在整个老年代中,随着时间推移,老年代中的对象分布及其散乱,这会造成大量内存碎片,最后会进行一次full GC来整理内存碎片。

在CDH中相应配置:

hbase master日志 hbase gc 日志_内存碎片

hbase master日志 hbase gc 日志_老年代_02

G1 GC 并发标记整理算法

// TODO