-
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中相应配置:
-
G1 GC 并发标记整理算法
// TODO