垃圾收集器(二)

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垃圾收集过程
  1. CMS Initial Mark:初始标记Root,STW(Stop The World,会停止应用程序);
  2. CMS Concurrent Mark:并发标记,从根节点往后标记,不需要停止应用程序;
  3. CMS-Concurrent-Preclean:并发预清理,标记出堆中所有存活对象;
  4. CMS Remark:重新标记,STW(Stop The World,会停止应用程序),在2,3步的时候会产生新的垃圾,修正3的结果;
  5. 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 (全局并发标记)
  1. Initial-marking phase:标记GC Root,STW;
  2. Root-Region-Scanning Phase:标记存活Region;
  3. Concurrent-Marking Phase:标记存活的对象;
  4. Remark-Phase:重新标记,STW;
  5. Cleanup-Phase:部分STW;
  6. 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秒;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值