Parallel Collector
- -XX:+UseParallelGC 手动开启,server模式默认开启;
- -XX:ParallelGCThreads=<n> 开启多少个GC线程;
CPU > 8 ,N=5/8;
CPU < 8 ,N=CPU;
并行收集器的自适应特性(Parallel Collector Ergonomics)
并行收集器有自适应的特性,给定几个指标,JVM会自动调整堆的大小以适应指标要求;
- -XX:GCTimeRatio=<n> 会优先满足吞吐量的要求;
- -XX:MaxGCPauseMills=<n> 在满足吞吐量的要求后会将停顿时间降到该值一下;
- -Xmx<n>;
动态内存调整
并行收集器在自适应的时候会动态调整内存;
- -XX:YongGenerationSizeIncrement=<Y> Yong区动态调整每次增加的大小,默认20%;
- -XX:TenuredGenerationSizeIncrement=<T> Old区动态调整每次增加的大小,默认20%;
- -XX:AdaptiveSizeDecrementScaleFactor=<D> 动态减小时每次减小的大小,默认4%;
CMS Collector
- 并发收集;
- 低停顿,低延迟;
- 老年代收集器;
CMS垃圾收集过程
- CMS Initial Mark:初始标记Root,STW(Stop The World,会停止应用程序);
- CMS Concurrent Mark:并发标记,从根节点往后标记,不需要停止应用程序;
- CMS-Concurrent-Preclean:并发预清理,标记出堆中所有存活对象;
- CMS Remark:重新标记,STW(Stop The World,会停止应用程序),在2,3步的时候会产生新的垃圾,修正3的结果;
- CMS Concurrent Sweep:并发清除;
CMS缺点
- CPU敏感,垃圾收集的时候会占用CPU,导致应用程序性能下降;
- 浮动垃圾,在垃圾收集的时候应用程序还会进行内存分配;
- 空间碎片;
CMS相关参数
- -XX:ConcGCThreads 并发的GC线程数,和应用程序同时执行的时候的线程数;
- -XX:+UseCMSCompactAtFullCollection FullGC之后做压缩,减少内存碎片;
- -XX:CMSFullGCsBeforeCompaction 多少此FullGC之后压缩一次;
- -XX:CMSInitiatingOccupancyFraction Old区占有多少存活对象时触发FullGC,默认大概是90%多;
- -XX:+UseCMSInitiatingOccupancyOnly 是否动态可调,如果启用这个值,就变成动态可调的了;
- -XX:+CMSScavengeBeforeRemark FullGC之前先做YGC;
- -XX:+CMSClassUnloadingEnabled 启用回收Perm区(JDK4~JDK7有Perm区);
G1 Collector
目标
满足大堆和短暂的停顿时间的要求;
G1中的几个概念
- Region:G1把Heap分成一块块的region,每个region大小相等;
- SATB:Snapshot-At-The-Beginning,它是通过Root Tracing得到的,GC开始时存活对象的快照;
- RSet:记录了其他Region中的对象引用本地Region中对象的关系,属于Points-into结构(谁引用了我的对象);
Yong GC
- 新对象进入Eden区;
- 发生Yong GC时把存活对象拷贝到Survivor里;
- 存活时间到达年龄阈值时,对象晋升到Old区;
Mixed GC
- 不是FullGC,回收所有的Yong和部分Old;
- 伴随着Mixed GC,有一个概念Global Concurrent Marking,全局并发标记;
Global Concurrent Marking (全局并发标记)
- Initial-marking phase:标记GC Root,STW;
- Root-Region-Scanning Phase:标记存活Region;
- Concurrent-Marking Phase:标记存活的对象;
- Remark-Phase:重新标记,STW;
- Cleanup-Phase:部分STW;
- Concurrent-Cleanup Phase:并发清理;
Mixed GC的时机
- -XX:InitiatingHeapOccupancyPercent 占有率达到这个数值触发Global Concurrent Marking,默认45%;
- -XX:G1HeapWastePercent 在Global Concurrent Marking结束后,可以知道有多少空间要被回收,在每次YGC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC;
Mixed GC相关参数
- -XX:G1MixedGCLiveThresholdPercent Old区的region被回收时候的存活对象占比;
- -XX:G1MixedGCCountTarget 一次Global Concurrent Marking之后,最多执行Mixed GC的次数;
- -XX:G1OldCSetRegionThresholdPercent 1次Mixed GC中能被选入CSet的最多Old区的region数量;
G1相关参数
- -XX:+UseG1GC 开启G1;
- -XX:G1HeapRegionSize=n region的大小,1-32M,最多不能超过2048个region;
- -XX:MaxGCPauseMills=200 最大停顿时间;
- -XX:G1NewSizePercent -XX:G1MaxNewSizePercent Yong区的占比;
- -XX:G1ReservePercent=10 保留防止to space溢出,就是发生Yong GC的时候,将一个S区和Eden区的对象移到另一个S区时发生的溢出;
- -XX:ParallelGCThreads=n STW线程数;
- -XX:ConcGCThreads=n 并发线程数=1/4*并行;
G1最佳实践
- 年轻代大小:避免使用-Xmn、-XX:NewRatio等显式设置Yong区大小,会覆盖暂停时间目标(XX:MaxGCPauseMills);
- 暂停时间目标:暂停时间不要设置的太严格,其吞吐目标是90%的应用程序时间和10%垃圾回收时间,太严格会直接影响到吞吐量;
是否考虑切换到到G1
- 50%以上的堆被存活对象占用;
- 对象的分配和晋升的速度变化非常快;
- 垃圾回收时间特别长,超过了1秒;