JVM(六) - JVM调优

前言

JVM调优主要是调整下面两个指标
停顿时间:垃圾收集器做垃圾回收中断应用执行的时间。-XX:MaxGCPauseMillis
吞吐量:垃圾收集的时间和总时间占比:1/(1+n) ,吞吐量为:1-1/(1+n)。-XX:GCTimeRation=n

GC调优步骤:

  1. 打印GC日志
    Tomcat则直接加在JAVA_OPTS变量里。
 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStampsXloggc:./gc.log
  1. 分析日志得到关键性指标
  2. 分析GC原因,调优JVM参数

如何分析GC日志
在这里插入图片描述
我们可以看到图中第一行红框,是项目的配置参数。这里不仅配置了打印GC日志,还有相关的VM内存参数。
第二行红框中的是在这个GC时间点发生GC之后相关GC情况。
1、对于0.521 这是具体发生GC的时间点。这是时间戳是从jvm启动开始计算的,前面还有具体的发生时间日期。
2、Full GC(Metadata GC Threshold)指这是一次full gc,括号里是gc的原因,PSYoungGen是年轻代的GC,ParOldGen是老年代的GC,Metaspace是元空间的GC
3、8975K->0K(269824K),这三个数字分别对应GC之前占用年轻代的大小,GC之后年轻代占用,以及整个年轻代的大小。
4、 120K->8844K(103936K),这三个数字分别对应GC之前占用老年代的大小,GC之后老年代占用,以及整个老年代的大小。
5、9095K->8844K(373760K),这三个数字分别对应GC之前占用堆内存的大小,GC之后堆内存占用,以及整个堆内存的大小。
6、20583K->20582K(1067008K),这三个数字分别对应GC之前占用元空间内存的大小,GC之后元空间内存占用,以及整个元空间内存的大小。
7、 0.0276948是该时间点GC总耗费时间。

上面的这些参数,能够帮我们查看分析GC的垃圾收集情况。但是如果GC日志很多很多,成千上万行。就算你一目十行,
看完了,脑子也是一片空白。所以我们可以借助一些功能来帮助我们分析,这里推荐一个gceasy(https://gceasy.io),可以
上传gc文件,然后他会利用可视化的界面来展现GC情况。具体下图所示

在这里插入图片描述
在这里插入图片描述
1.Parallel Scavenge收集器(默认)
分析gc文件

2.配置CMS收集器
-XX:+UseConcMarkSweepGC
分析gc文件

3.配合G1收集器
-XX:+UseG1GC
分析gc文件

  • young GC: [GC pause (G1 Evacuation Pause) (young)
  • initial-mark: [GC pause (Metadata GC Threshold) (young)
    (initial-mark)(参数InitiatingHeapOccupancyPercent)
  • mixed GC: [GC pause (G1 Evacuation Pause) (mixed) (参数:G1
    HeapWastePercent)
  • full GC: [Full GC (Allocation Failure) (无可用region)

(G1内部,前面提到的混合GC非常重要的释放内存机制,它避免了G1出现Region没有可用的情况,否则就会触发Full GC事件。
CMS,Parallel,Serial GC都需要通过Full GC去压缩老年代并在这个过程中扫描整个老年代。
G1的Full GC算法和Serial GC收集器完全一致。当一个Full GC发生时,整个Java堆执行一个完整的压缩,这样确保了最大的空闲内存可用。
G1的Full GC是一个单线程,它可能引起一个长时间的停顿,G1的设计目标是减少Full GC,满足应用性能目标

查看MixedGC的阈值:jinfo -flag InitiatingHeapOccupancyPercent id
调优:
第一次调优,设置Metaspace大小,增大元空间大小 ‐XX:MetaspaceSize=64M ‐XX:MaxMetaspaceSize=64M
第二次调优,添加吞吐量和停顿时间参数:-XX:GCTimeRatio=98 XX:MaxGCPauseMillis=10

G1收集器参数设置

1.常用参数
XX:+UseG1GC:使用G1收集器
-XX:ParallelGCThreads:指定GC工作的线程数量
-XX:G1HeapRegionSize:指定分区大小(1MB~32MB,且必须是2的幂),默认将整堆划分为2048个分区
-XX:MaxGCPauseMillis:目标暂停时间(默认200ms)
-XX:G1NewSizePercent:新生代内存初始空间(默认整堆5%)
-XX:G1MaxNewSizePercent:新生代内存最大空间
-XX:TargetSurvivorRatio:Survivor区的填充容量(默认50%),Survivor区域里的一批对象(年龄1+年龄2+年龄n的多个年龄对象)总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代
-XX:MaxTenuringThreshold:最大年龄阈值(默认15)
-XX:InitiatingHeapOccupancyPercent:老年代占用空间达到整堆内存阈值(默认45%),则执行新生代和老年代的混合收集(MixedGC),比如我们之前说的堆默认有2048个region,如果有接近1000个region都是老年代的region,则可能就要触发MixedGC了
-XX:G1HeapWastePercent(默认5%): gc过程中空出来的region是否充足阈值,在混合回收的时候,对Region回收都是基于复制算法进行的,都是把要回收的Region里的存活对象放入其他Region,然后这个Region中的垃圾对象全部清理掉,这样的话在回收过程就会不断空出来新的Region,一旦空闲出来的Region数量达到了堆内存的5%,此时就会立即停止混合回收,意味着本次混合回收就结束了。
-XX:G1MixedGCLiveThresholdPercent(默认85%) region中的存活对象低于这个值时才会回收该region,如果超过这个值,存活对象过多,回收的的意义不大。
-XX:G1MixedGCCountTarget:在一次回收过程中指定做几次筛选回收(默认8次),在最后一个筛选回收阶段可以回收一会,然后暂停回收,恢复系统运行,一会再开始回收,这样可以让系统不至于单次停顿时间过长。

2 .最佳实践
a.年轻代大小:1s免使用-Xmn、-XX:NewRati等显示设置Young区大小,会覆盖暂停时间目标(常用参数3)
b.暂停时间目标:哲停时间不要太严苛,其吞吐量目标是90%的应用程序时间和10%的垃圾回收时间,太严苛会直接影响到吞吐量
3 .是否需要切换到G1
a. 50%以上的堆被存活对象占用
b.对象分配和晋升的速度变化非常大
c.垃圾回收时间特别长,超过1秒
4 .G1调优目标
a. 6GB以上内存
b.停顿时间是500ms以内
c.吞吐量是90%以上

GC常用参数
堆栈内存
-Xss:每个线程的栈大小
-Xms:初始埴大小,默认物理内存的1/64
-Xmx:最大埴大小,默认物理内存的1/4
-Xmn:新生代大小
-XX:NewSize:设置新生代初始大小
-XX:NewRatio:默认2表示新生代占年老代1/2 占整个堆内存的1/3.
-XX:SurvivorRatio:默认8去示一个survivor区占用1/8的Eden内存.即1/10新生代内存.
-XX:MetaspaceSize:设置元空间大小
-XX:MaxMetaspaceSize:设置元空间最大允许大小,默认不受限制,JVM Metaspace会进行动态扩展.

收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
-XX:+UseG1GC:使用G1收集器

垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename

并行收集器设置
-XX:ParallelGCThreads:设置并行收集器收集时使用的CUP数.并行收集线程数.
-XX:MaxGCPauseMillis:设置并行收集器最大停顿时间
-XX:GCTimeRatio:设置垃圾回收时间占程序运行时间的百分比.1-1/(1+n)
-XX:YoungGenerationSizelncrement:年轻代gc后扩容比例,默认是20(%)
CMS收集器设置
-XX:UseConcMarkSweepGC:设置CM 访发收票器
-XX:CMSIncrcmernalMode:设置为增量模式.适用于单CPU情况.
-XX:ParallelGCThreads:设置并发收集器新生代收集方式为用并行收集,使用的CPU数.并行收集线程数.
-XX:QMSFullGCsBeforeCompaclion:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSCIassUEoadingEnabled:允许对类元数据进行回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到阈值的时候,才进口CMS回收
-XX:CMSIncrementaiMode:设置为增量模式.适用于单CPU情况
-XX:Pa向lelCMSThreads:设定CMS的线程数,
-XX:CMSInitialingOcojpancyFracUon:设置CMS收集器在老年代空间被使用多少后触发
-XX:UseCMSCompactAlFullCollection:设置CMS收集器在完成垃圾收集后是否要迸行一次内存碎片的整理

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值