• jvm调优工具


    1.jps 查询当前服务器启动了哪些java项目

     2.jmap -histo 16332>./histo.log

     3.jmap -heap 16632查询堆的信息

     4.jmap ‐dump:format=b,file=kk.hprof 16332 堆栈导出,

    线上环境可以设置内存溢出时自动导出堆信息

    1. -XX:+HeapDumpOnOutOfMemoryError
    2. -XX:HeapDumpPath=./ (路径)

    可以用jvusalvm进行分析

    5.jstack + 进程id可以查询死锁

     prio:java线程的优先级,os_prio:java线程优先级在系统中的标识   tid:代表java线程编号  nid:java线程编号在系统的标识

     用jvsualvm查询:

    6.远程连接jvsualvm:

     需要配置:

    java ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.50.60 ‐Dcom.sun.management.jmxremot
    e.ssl=false ‐Dcom.sun.management.jmxremote.authenticate=false ‐jar xxxxxx‐server.jar

    -Dcom.sun.management.jmxremote.port 为远程机器的JMX端口
    -Djava.rmi.server.hostname 为远程机器IP

    tomcat的JMX配置:在catalina.sh文件里的最后一个JAVA OPTS的赋值语句下一行增加如下配置行
    JAVA_OPTS="$JAVA_OPTS ‐Dcom.sun.management.jmxremote.port=8888 ‐Djava.rmi.server.hostname=192.168.50.60 ‐Dcom.sun.management.jmxremote.ssl=false ‐Dcom.sun.management.jmxremote.authenticate=false"

     7. jinfo -flags 进程Id :查询jvm的参数

      8. 查询系统的参数:jinfo -sysprops 23392

     9. jstat  -gc +pid

     S0C: S0区的总大小  S0U :S0区已使用大小        S1C: S1区的总大小  S1U :S1区已使用大小     EC: eden区的总大小  EU :eden区已使用大小    OC 和OU代表老年代的总量和使用量

    MC和MU代表元空间的总大小和使用大小   CCSC和CCSU代表压缩空间的大小和使用大小  YGC和YGCT代表年轻代回收次数和时间  FGC和FGCT代表老年代的回收次数和时间 GCT代表总回收时间

     10. jstat -gcutil +pid查看使用比率

     

     优化建议:

    JVM运行情况预估
    用 jstat gc -pid 命令可以计算出如下一些关键数据,先给自己的系统设置一些初始性的
    JVM参数,比如堆内存大小,年轻代大小,Eden和Survivor的比例,老年代的大小,大对象的阈值,大龄对象进入老年代的阈值等。

    年轻代对象增长的速率
    可以执行命令 jstat -gc pid 1000 10 (每隔1秒执行1次命令,共执行10次),通过观察EU(eden区的使用)来估算每秒eden大概新增多少对
    象,如果系统负载不高,可以把频率1秒换成1分钟,甚至10分钟来观察整体情况。注意,一般系统可能有高峰期和日常期,所以需要在不
    同的时间分别估算不同情况下对象增长速率。

    Young GC的触发频率和每次耗时
    知道年轻代对象增长速率我们就能推根据eden区的大小推算出Young GC大概多久触发一次,Young GC的平均耗时可以通过 YGCT/YGC
    公式算出,根据结果我们大概就能知道系统大概多久会因为Young GC的执行而卡顿多久。


    每次Young GC后有多少对象存活和进入老年代
    这个因为之前已经大概知道Young GC的频率,假设是每5分钟一次,那么可以执行命令 jstat -gc pid 300000 10 ,观察每次结果eden,
    survivor和老年代使用的变化情况,在每次gc后eden区使用一般会大幅减少,survivor和老年代都有可能增长,这些增长的对象就是每次
    Young GC后存活的对象,同时还可以看出每次Young GC后进去老年代大概多少对象,从而可以推算出老年代对象增长速率。


    Full GC的触发频率和每次耗时
    知道了老年代对象的增长速率就可以推算出Full GC的触发频率了,Full GC的每次耗时可以用公式 FGCT/FGC 计算得出。
    优化思路其实简单来说就是尽量让每次Young GC后的存活对象小于Survivor区域的50%,都留存在年轻代里。尽量别让对象进入老年
    代。尽量减少Full GC的频率,避免频繁Full GC对JVM性能的影响。

     11. Arthas 阿里开源的一个jvm检测工具,非常强,详细使用根据官网学习即可  https://arthas.aliyun.com/doc/

    12. GC 日志:

    jvm的配置:-Xloggc:D:/gc‐%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+PrintGCCause -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M

    上面的配置会在D盘,生成GC相关的日志,总共会保留10份,没份的大小是100M

     程序运行配置:

    java ‐jar ‐Xloggc:./gc‐%t.log ‐XX:+PrintGCDetails ‐XX:+PrintGCDateStamps ‐XX:+PrintGCTimeStamps ‐XX:+PrintGCCause ‐XX:+UseGCLogFileRotation ‐XX:NumberOfGCLogFiles=10 ‐XX:GCLogFileSize=100M xxkkkk.jar

    日志的内容大概如下:

     上面所示:第一列是GC发送的时间,0.092是项目启动到GC经过的时间,接着是这次GC产生的原因,后面PSYoungGen: 2048K->504K(2560K)]  2048K是GC前新生代的使用的大小,504K是新生代GC后内存使用大小,2560K是新生代的总大小,

     0.0015258这个是GC的时间;

    我们可以配置不同的垃圾处理器来看他们的日志,不同垃圾收集器的GC日志是不一样的,导出GC日志后,我们可以使用专门的日志工具进行分析

    登录网站:https://gceasy.io/

    java -XX:+PrintFlagsInitial 表示打印出所有参数选项的默认值
    java -XX:+PrintFlagsFinal 表示打印出所有参数选项在运行程序时生效的值

  • 相关阅读:
    Access restriction: The type BASE64Encoder is not accessible due to restrict(转载)
    ECLIPSE控制台信息导出
    ZUI分页器的使用案例(ECLIPSE SMS项目)
    关于PLSQL启动用时较长的问题解决
    javax.naming.NamingException: Cannot create resource instance报错修改
    百度AI人脸识别的学习总结
    ECharts3.0饼状图使用问题总结
    jni开发
    AndroidStudio封装jar并混淆
    Androidstudio代码混淆
  • 原文地址:https://www.cnblogs.com/yangxiaohui227/p/15745600.html
Copyright © 2020-2023  润新知