zoukankan      html  css  js  c++  java
  • JVM常用调优工具介绍

     

    前言

    王子在之前的JVM文章中已经大体上把一些原理性问题说清楚了,今天主要是介绍一些实际进行JVM调优工作的工具和命令,不会深入讲解,因为网上资料很多,篇幅可能不长,但都是实用的内容,小伙伴们有不清楚的可以自行查找资料。

    jstat命令

    jstat命令可以查看到很多的jvm信息,详细内容可以自行百度,本篇只介绍我们经常使用的命令。

    jstat -gc PID 1000 10

    一般最常用的命令就是这个了,它的意思是每1秒打印一次jvm的内存信息,打印10次。

    通过此命令可以分析出新生代对象的增长速度,Young GC的触发频率和耗时、老年代的增长速度、Full GC的触发频率和耗时。

    分析之后进行合理的jvm参数设置进行调优工作。

    里面的各个参数解释如下:

    • S0C:第一个幸存区的大小
    • S1C:第二个幸存区的大小
    • S0U:第一个幸存区的使用大小
    • S1U:第二个幸存区的使用大小
    • EC:伊甸园区的大小
    • EU:伊甸园区的使用大小
    • OC:老年代大小
    • OU:老年代使用大小
    • MC:方法区大小
    • MU:方法区使用大小
    • CCSC:压缩类空间大小
    • CCSU:压缩类空间使用大小
    • YGC:年轻代垃圾回收次数
    • YGCT:年轻代垃圾回收消耗时间
    • FGC:老年代垃圾回收次数
    • FGCT:老年代垃圾回收消耗时间
    • GCT:垃圾回收消耗总时间

    PID可以通过jps命令获得,jps就是一个查看java进程的命令,没什么可说的,不清楚的小伙伴百度了解下即可。

    jmap和jhat命令

    jmap -dump:live,format=b,file=dump.hprof PID

    生成内存快照,以供分析内存占用情况。

    jhat dump.hprof

    分析内存快照,内置了web容器,可以通过浏览器分析堆内存快照。

    MAT工具

    功能比较强大的内存分析工具,可以替代jhat。

    需要注意的一点是,线上导出来的dump如果很大的话,比如有几个GB,使用MAT之前需要修改MemoryAnalyzer.ini文件,修改堆内存的大小足够容纳你的dump文件

    常用的监控系统

    一般我们可以配置一套自动化监控系统,如果发现JVM出现异常,可以报警,比如发送短信或邮件给负责人。

    常用的有Zabbix,Ganglla,Open-Falcon,Prometheus。

    如果想要引入一套监控系统,可以自行了解以上监控系统,在其中选择一个。

    一套JVM调优的参数模板

    以下是王子在jvm调优工作中总结的常用调优参数,在这里分享给小伙伴们,一般合理的配置以下参数就可以获得一个比较好的性能

    -Xms2048m 初始堆大小
    -Xmx2048m 最大堆大小
    -Xmn1024m 年轻代大小
    -XX:PermSize=256m 设置持久代(perm gen)初始值(JDK8以后弃用改为-XX:MetaspaceSize)
    -XX:MaxPermSize=256m 设置持久代最大值(JDK8以后弃用改为-XX:MaxMetaspaceSize)
    -Xss1m 每个线程的堆栈大小(等价于-XX:ThreadStackSize)
    -XX:SurvivorRatio Eden区与Survivor区的大小比值(默认为8)
    -XX:+DisableExplicitGC 关闭System.gc(),如果系统中使用了nio调用堆外内存,慎用此参数
    -XX:MaxTenuringThreshold=15 年轻代垃圾回收最大年龄,默认15,15次后进入老年代
    -XX:PretenureSizeThreshold 对象超过多大直接在老年代分配
    -XX:+UseParNewGC 使用ParNewGC垃圾回收器
    -XX:+UseConcMarkSweepGC 使用CMS内存收集
    -XX:CMSInitiatingOccupancyFraction=92 CMS垃圾收集器,当老年代达到92%时,触发CMS垃圾回收
    -XX:CMSFullGCsBeforeCompaction=0 多少次后进行内存压缩,默认0

    -XX:+CMSScavengeBeforeRemark

    CMS重新标记之前尽量进行一次Young GC
    -XX:+UseCMSCompactAtFullCollection 在FULL GC的时候, 对老年代的压缩,默认打开
    -XX:+CMSParallelInitialMarkEnabled CMS初始标记并行化,增加初始标记速度
    -Xverify:no 禁止字节码校验,提高编译速度(jdk13之后作废,生产环境不使用)
    -XX:+UseG1GC 使用G1垃圾回收器
    -XX:MaxGCPauseMillis=200 目标GC暂停时间,尽可能目标

    -XX:+PrintGCTimeStamps
    -XX:+PrintGCDetails
    -Xloggc:d:idea_gc.log

    合并使用,打印GC信息到指定文件

    -XX:+HeapDumpOnOutOfMemoryError

    表示当JVM发生OOM时,自动生成DUMP文件

    -XX:HeapDumpPath=${目录}

    表示生成DUMP文件的路径,也可以指定文件名称,例如:-XX:HeapDumpPath=${目录}/java_heapdump.hprof。如果不指定文件名,默认为:java_<pid>_<date>_<time>_heapDump.hprof

    总结

    到这里本篇文章就结束了,关于JVM部分的文章可能暂时也结束了,下边的话是一些经验之谈。

    如何具体的做好JVM调优不是简简单单的一篇文章就能说得清的,不要相信什么网上的万能jvm调优模板,王子提供的模板也只是常用的一些调优参数,一切的调优都需要通过分析实际生产环境情况后,才能做出最适合生产环境的调优方案,真正能证明你价值的地方就在于你的分析并处理问题的能力,而不是说你懂了JVM的原理就可以了,JVM原理只是基础,能把它实际运用才能称它为价值!

    如果想成为一个JAVA高级工程师甚至架构师,JVM调优是必备技能之一,需要小伙伴们经过大量真实的调优工作后才会有所心得,这个就要靠大家自己去实践了。

    如果有小伙伴感兴趣,王子可以接着写一些实践场景的文章,这个是后话了。

    本文主要是提供了一些工具和命令的介绍,并提供了常用的JVM调优参数,它们是你实践的开始。

    也欢迎小伙伴们留言说出你的想法。

    往期文章推荐:

    大白话谈JVM的类加载机制

    JVM内存模型不再是秘密

    轻松理解JVM的分代模型

    秒懂JVM的垃圾回收机制

    探索ParNew和CMS垃圾回收器

    探索G1垃圾回收器

  • 相关阅读:
    快速排序
    ​直接插入排序(Straight Insertion Sort)
    希尔排序(Shell Sort)
    直接选择排序(Straight Selection Sort)
    安卓倒计时
    Could not resolve com.android.support:multidex:1.0.2
    黄油刀的配置文件
    黄油刀的配置文件
    Unable to start activity ComponentInfo{com.example.administrator.myapplication/com.example.administrator.myapplication.MainActivity}: android.view.InflateException: Binary XML file line #0: Binary XM
    java禁止实例化的工具类
  • 原文地址:https://www.cnblogs.com/lm970585581/p/13957169.html
Copyright © 2011-2022 走看看