Java生产环境下性能监控与调优详解

基于JDK命令行工具的监控

  1. JVM参数类型
    1. 标准参数
      1. -help
      2. -server -client
      3. -version -showversion
      4. -cp -classpath
    2. X参数
      1. 非标准参数
      2. -Xint 解释执行
      3. -Xcomp 第一次使用旧编译成本地代码
      4. -Xmixed 混合模式JVM自己决定是否编译成本地代码
    3. XX参数
      1. 非标准化参数
      2. 相对不稳定
      3. 主要主要JVM调优和Debug
      4. Boolean 类型
        1. -XX[+-] name 表示启用或者禁用name属性

例如:-XX:+UseConMarkSweepGC

         -XX: +UseG1GC

      1. 非Boolean 类型
        1. 格式:-XX:=表示name属性的数时value

比如-XX:MaxGCPauseMillis=500

       XX:GCTimeRatio=19

备注:-Xmx 和 -Xms

不是X参数,而是XX参数

-Xms等于-XX:InitialHeapSize

-Xmx等于-XX: MaxHeapSize

  1. 运行时JVM参数查看
    1. -XX:+PrintFlagslnitial
      1. =代表默认值
      2. :=被用户或者JVM修改之后的数值
      3. InitialHeapSize代表初始堆的大小

        查看是否启用UseG1GC

        1. -XX:+PrintFlagsFinal
          1. -XX:+UnlockExperimentalVMOptions解锁实验参数
          2. Jps类似ps,java进程的查看
        2. Java生产环境下性能监控与调优详解_第1张图片

          Jps -l

          Java生产环境下性能监控与调优详解_第2张图片

          1. Jinfo查看进程的详细信息
        3. Java生产环境下性能监控与调优详解_第3张图片查看jar的设置最大内存

          根据jps -l获取进程号

          Jinfo -flags 进程号

          Java生产环境下性能监控与调优详解_第4张图片

          查看进程的最大内存

          Jinfo -flag MaxHeapSize 进程号

          Jinfo -flag MaxHeapSize 22886

          查看是否启用垃圾回收器

          jinfo -flag UseConcMarkSweepGC 22865 进程号

          jinfo -flag UseConcMarkSweepGC 22886

          jinfo -flag UseParallelGC 22865

           

        4. Jstat查看虚拟机统计信息
          1. 类装载
        5. Jstat -class 3176 1000 10

          3176是PID

                 1000毫秒

          10次

          Java生产环境下性能监控与调优详解_第5张图片

           

          1. 垃圾收集
        6. -gc、-gcutil、-gccause、gcnew、-gcold

          -gc的输出结果

          S0C、S1C、S0U、S1U:S0和S1的总量与使用量

          EC、EU:Eden区总量与使用量

          OC、OU:Old区总量与使用量

          MC、MU:Metaspace区总量个使用量

          CCSC、CCSU:压缩类空间总量与使用量

          YGC、YGCT:YoungGC的次数和时间

          FGC、FGCT:FullGC的次数与时间

          GCT:总的GC时间

          JVM的内存结构

          Java生产环境下性能监控与调优详解_第6张图片:

          1. JIT编译
        7. 先查看进程号

          jstat -compiler PID

          Compiled编译次数

          Failed     失败的次数

          FailedMethod 错误的方法

        8. Jmap+MAT实战内存溢出
        9. Java生产环境下性能监控与调优详解_第7张图片

          Metaspace内存溢出

          Java生产环境下性能监控与调优详解_第8张图片

          堆内存溢出

          导出内存映像文件

              1. 内存溢出时自动导出
        10. -XX:+HeapDumpOnOutOfMemoryError

          -XX:HeapDumpPath=./

          Java生产环境下性能监控与调优详解_第9张图片

              1. 使用jmap命令手动导出
        11. Jmap -heap PID 打印内存里面内存的信息

          Java生产环境下性能监控与调优详解_第10张图片

          ./jmap -dump:format=b,file=./heap.hprof -F PID

          ./jmap -dump:format=b,file=./heap.hprof -F 15203

          Java生产环境下性能监控与调优详解_第11张图片

          下载一个Eclipse Mat工具,数据分析

        12. Jstack 实战死循环与死锁(可以打出cpu过高的问题)
        13. Java生产环境下性能监控与调优详解_第12张图片

          先查看进程

          Jstack PID >PID.txt.

          jstack 28014 >28014.txt 将进程里面的数据导出

          Java生产环境下性能监控与调优详解_第13张图片

          Top -p 28029 -H 是输出的进程号十进制,需要转换十六进制

          Java生产环境下性能监控与调优详解_第14张图片

          JAVA线程状态

          NEW线程还没有启动

          RUNNABLE运行的已经在JVM中运行了

          BLOCKED阻塞的,等待一个锁

          WAITING 等待

          TIMED_WAITING 等待的多少时间

          TERMINATED线程已经退出了

           

          检查线上CPU过高的问题

          表现的症状:CPU过高,load average 负载过高

          先使用TOP命令,查看CPU

          Java生产环境下性能监控与调优详解_第15张图片

          发现CPU过高的是进程为7930的进程

          然后将信息打印出来:jatack >7903 >7903.txt

          使用top 命令打印线程:top -p 7930 -H

          可以发现有异常的5个线程

          Java生产环境下性能监控与调优详解_第16张图片

          将进程号为8十进制8247的转换成十六进制:2037

          Print “%x” 8247

          将下载的日志文件搜索2037

          Java生产环境下性能监控与调优详解_第17张图片

          可以看到在执行问题函数,通过全局搜索,发现这个函数在执行了5次,和上面的五个线程就对应了,可以让开发重点排查一下这个函数的问题

          Java生产环境下性能监控与调优详解_第18张图片

           

          检查线上死锁的问题

          通过ps -ef|grep java 查出进程号

          使用jatack PID >PID.txt 导出日志

          Java生产环境下性能监控与调优详解_第19张图片

           

          可以给开发进行排查

        14. Java生产环境下性能监控与调优详解_第20张图片

你可能感兴趣的:(运维)