侧边栏壁纸
  • 累计撰写 43 篇文章
  • 累计创建 9 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

JVM调优各垃圾回收器参数

landonchan
2015-12-15 / 0 评论 / 1 点赞 / 66 阅读 / 5194 字
温馨提示:
欢迎留言讨论!若内容或图片失效,请留言反馈。若不小心影响到您的利益,请联系我们删除。

经验

  1. 系统真正最大的问题,就是因为内存分配、参数设置不合理,导致你的对象 频繁的进入老年代,然后频繁触发老年代gc,导致系统频繁的每隔几分钟就要卡死几秒钟。

  2. 针对大内存机器通常建议采用G1垃圾回收器。

  3. 尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象 进入老年代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。

通用

  1. -Xms:Java堆内存的大小

  2. -Xmx:Java堆内存的最大大小

  3. -Xmn:Java堆内存中的新生代大小,扣除新生代剩下的就是老年代的内存大小了

  4. -XX:PermSize:永久代大小

  5. -XX:MaxPermSize:永久代最大大小

  6. -Xss:每个线程的栈内存大小

  7. -XX:MetaspaceSize:元空间初始大小

  8. -XX:MaxMetaspaceSize:元空间最大值 推荐512MB就够了

  9. -XX:MaxTenuringThreshold 默认15岁,当回收15次也回收不了,就进入老年代。

  10. -XX:PretenureSizeThreshold 对象大小超过这个值,直接进入老年代。

  11. -XX:HandlePromotionFailure 老年代可用空间是否大于历次Minor GC过后进入老年代的对象的平均大小

  12. -XX:SurvivorRatio=8 调整新生代eden区占新生代比例8/10.

  13. -XX:MaxDirectMemorySize=2G 堆外内存最大值

  14. -XX:TargetSurvivorRatio 默认50%,动态年龄,1+。。+n的Survivor中对象超过这个比例,就去老年代。

  15. -XX:+DisableExplicitGC 禁止显式执行GC,不允许你来通过代码触发GC

  16. -XX:+HeapDumpOnOutOfMemoryError OOM的时候自动dump内存快照出来

  17. -XX:HeapDumpPath=/usr/local/app/oom 把内存快照放到哪儿去

  • Xms与Xmx设置一样。

  • XX:PermSize与XX:MaxPermSize设置一样,一般设置几百MB。(低版本)

  • XX:MetaspaceSize与MaxMetaspaceSize设置一样,一般几百MB。(1.8及以上)

  • Xss一般默认即可,512KB到1MB。

示例:
java -Xms512M -Xmx512M -Xmn256M -Xss1M -XX:PermSize=128M -XX:MaxPermSize=128M -jar App.jar

使用哪种GC算法

  1. -XX:+UseParNewGC 新生代使用ParNew回收算法

  2. -XX:+UseSerialGC 新生代设置串行收集器

  3. -XX:+UseParallelGC 新生代设置并行收集器

  4. -XX:+UseParalledlOldGC 设置并行年老代收集器

  5. -XX:+UseConcMarkSweepGC 老年代设置CMS

  6. -XX:+UseG1GC 用G1,全堆

ParNew

  1. -XX:ParallelGCThreads 新生代回收并行线程数,默认cpu核数,可通过此参数进行设置。

  2. -XX:+UseParNewGC 新生代使用ParNew回收算法

Parallel Scavenge

  1. -XX:MaxGCPauseMillis Parallel Scavenge 垃圾回收算法控制最大的垃圾收集停顿时间(尽力)

  2. -XX:GCTimeRatioi Parallel Scavenge设置吞吐量的大小,取值0-100,系统花费不超过1/(1 +n)的时间用于垃圾收集

  3. -XX:+UseAdptiveSizePolicy  Parallel Scavenge回收器打开自适应策略后,无需手动设置新生代的大小( -Xmn )、Eden与Survivor区的比例( -XX:SurvivorRatio )等参数虚拟机会自动根据系统的运行状况收集性能监控信息,动态地调整这些参数,从而达到最优的停顿时间以及最高的吞吐量

  4. -XX:ParallelGCThreads 新生代回收并行线程数,默认cpu核数,可通过此参数进行设置。

  5. -XX:+UseParallelGC 新生代设置并行收集器

cms

  1. -XX:CMSInitiatingOccupancyFraction 参数可以用来设置老年代占用多少比例的时候触发CMS垃圾回收

  2. -XX:+UseCMSCompactAtFullCollection 默认是打开的,在Full GC之后要再次进行“Stop the World”,停止工作线程,然后进行碎片整理,就是把存活对象挪到一起,空出来大片连续内存空间,避免内存碎片。

  3. -XX:CMSFullGCsBeforeCompaction  执行多少次Full GC之后再执行一次内存碎片整理的工作,默认是0,意思就是每次Full GC之后都会进行一次内存整理。

  4. -XX:+UseConcMarkSweepGC 老年代设置CMS

  5. -XX:+UseCMSInitiatingOccupancyOnly 只是用设定的回收阈值,如果不指定,JVM仅在第一次使用设定值,后续则自动调整.

  6. -XX:+CMSIncrementalMode 该标志将开启CMS收集器的增量模式。增量模式经常暂停CMS过程,以便对应用程序线程作出完全的让步。因此,收集器将花更长的时间完成整个收集周期。

  7. -XX:+CMSScavengeBeforeRemark 在CMS GC前启动一次ygc,目的在于减少old gen对ygc gen的引用,降低remark时的开销

  8. -XX:ParallelCMSThreads=6 定义并发CMS过程运行时的线程数

  9. -XX:+CMSParallelInitialMarkEnabled 开启该阶段的并行标记,使用多个线程进行标记,减少暂停时间。

  10. -XX:+CMSParallelRemarkEnabled 开启并行的Remark,加快remark的速度。

g1

  1. -XX:+UseG1GC 用G1,全堆,会自动用堆大小除以2048,因为JVM最多可以有2048个Region,然后Region的大小必须是2的倍数

  2. -XX:G1HeapRegionSize 手动指定每个region的大小

  3. -XX:G1NewSizePercent 新生代初始region比例,默认5%

  4. -XX:G1MaxNewSizePercent 新生代最大百分比,默认60%

  5. -XX:MaxGCPauseMills 最大停顿时间,默认200ms

  6. -XX:InitiatingHeapOccupancyPercent 默认45%,达到这个值就会混合GC。

  7. -XX:G1MixedGCCountTarget 一次混合回收,最后一个阶段执行几次回收,默认8次。

  8. -XX:G1HeapWastePercent 默认5%,混合回收时,如果空闲区域比例超过这个值就停止混合回收。

  9. -XX:G1MixedGCLiveThresholdPercent 默认85%,意思是region里面存活的对象比例低于这个值,才会混合回收

模版

-Xms4096M -Xmx4096M -Xmn3072M -Xss1M 
-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M 
-XX:+UseParNewGC -XX:+UseConcMarkSweepGC 
-XX:CMSInitiatingOccupancyFaction=92 
-XX:+UseCMSCompactAtFullCollection 
-XX:CMSFullGCsBeforeCompaction=0 
-XX:+CMSParallelInitialMarkEnabled 
-XX:+CMSScavengeBeforeRemark
-XX:+PrintGCDetails 
-Xloggc:gc.log 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/usr/local/app/oom

1

评论区