zoukankan      html  css  js  c++  java
  • Java虚拟机性能监控与调优

    1 基于JDK命令行工具的监控

    1.1 JVM的参数类型

    1.1.1 标准参数

      在JVM的各个版本基本上保持不变,很稳定的。

      -help

      -server -client

      -version -showversion

      -cp -classpath

    1.1.2 X参数

      非标准化参数

      -Xint: 解释执行

      -Xcomp: 第一次使用就编译成本地代码

      -Xmixed: 混合模式,JVM自己来决定是否编译成本地代码

    1.1.3 XX参数

      非标准化参数

      相对不稳定

      主要用于JVM调优和Debug

      Boolean类型

      格式:-XX:[+-]<name>表示启用或者禁用name属性

      比如:-XX:+UseConcMarkSweepGC

         -XX:+UseG1GC

      非Boolean类型

      格式:-XX:<name>=<value>表示name属性的值是value

      比如:-XX:MaxGCPauseMillis=500

         -XX:GCTimeRatio=19

      -Xmx  -Xms

      -Xms等价于-XX:InitialHeapSize

      -Xmx等价于-XX:MaxHeapSize

      

    命令 作用
    ps -ef|grep java 查看java的进程相关信息,以及启动的配置信息
    jinfo -flag MaxHeapSize pid 查看该pid的JVM最大的堆内存大小
    jinfo -flag ThreadStackSize pid 查看该pid的JVM每个线程的栈大小

    1.2 运行时JVM参数查看

      -XX:+PrintFlagsInitial

        初始值

      -XX:+PrintFlagsFinal

        最终值

      

      =  表示默认值

      :=  被用户或者JVM修改后的值

      -XX:+UnlockExperimentalVMOptions  解锁实验参数

      -XX:+UnlockDiagnosticVMOptions    解锁诊断参数

      -XX:+PrintCommandLineFlags     打印命令行参数

      jps

      类似与Linux服务器上的ps功能。

      相关命令:

      jps -help  查看帮助

      jps -l  查看正在运行的列表

      jps命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jps.html

         jinfo命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jinfo.html#BCGEBFDD

      jstack命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstack.html#BABGJDIF

      jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB

      jinfo

      查看正在运行的JVM里面的参数值。

      相关命令:jinfo -flag MaxHeapSize pid  查看正在运行的进程为PID的JVM的最大堆内存

           jinfo -flags pid  查看正在运行的进程为PID的JVM的已经被修改过的JVM的参数值

      查看最大内存

      

       查看垃圾回收器

      

    1.3 jstat查看虚拟机统计信息

        类装载

        jstat命令详细参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html#BEHHGFAE

        参考命令:jstat -class pid  查看类加载的信息

             jstat -class pid 1000 10  每隔1000ms打印一次类加载信息,打印10次。

        垃圾收集

        参考命令:jstat -gc pid  查看进程号为pid的JVM的垃圾收集信息,具体响应详细参数jstat命令详细参考

             jstat -gc pid 1000 10  每隔1000ms打印一次进程号为pid的JVM的垃圾收集信息,打印10次。

        JIT编译

        参考指令:jstat -compiler pid  查看进程号为pid的JVM的即时编译信息。

     2 Jmap+MAT实战内存溢出

     

    2.1 模拟对内存溢出的代码参考:

      

    2.2 如何导出内存映像文件

    2.2.1 内存溢出自动导出

      程序启动的时候,设置以下参数

      -XX:+HeapDumpOnOutOfMemoryError

      -XX:HeapDumpPath=./

    2.2.2 使用jmap命令手动导出

      jmap -dump:format=b,file=heap.hprof pid  导出进程号为pid的JVM的dump文件

      jmap -heap pid               打印进程号为pid的JVM的堆信息

      jmap命令

      option: -heap, -clstats, -dump:<dump-options>, -F

      更多详细命令参考:jmap命令详细介绍参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jmap.html#CEGCECJB

    2.3 MAT分析内存溢出

      MAT工具下载地址:http://www.eclipse.org/mat/downloads.php

      将步骤2.2导出的dump文件,用MAT工具打开分析。    

    2.4 JAVA线程状态

      NEW  WAITING  RUNNABLE  TIMED_WAITING  BLOCKED  TERMINATED

      更多详细信息参考:https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr034.html

    3 实战死循环导致CPU飙高

      查找死循环导致CPU飙高问题的常用指令:

        top -p pid -H          #打印该进程的所有线程,查看占用CPU资源超高的线程ID,该线程ID为10进制,要用下面的命令将其转换为16进制,然后在stack信息中查找详细信息

        printf "%x" 十进制的线程id    #将十进制的线程id转换为16进制 

        jstack pid               #打印程序的stack信息,从中找出CPU占用超过的线程ID的stack信息

      也可以参考:https://www.cnblogs.com/alsodzy/p/10188691.html,来排查CPU飙高的问题。

  • 相关阅读:
    C++-蓝桥杯-颠倒的价牌[2013真题][水题][模拟]
    C++-蓝桥杯-振兴中华[2013真题][水题][dp/递归]
    C++-蓝桥杯-排它平方数[2013][水题][枚举]
    C++-蓝桥杯-高斯日记[2013真题][水题][枚举模拟]
    C++-蓝桥杯-购物清单[2017真题][水题][文件输入]
    C++-蓝桥杯-九宫幻方[暴力搜索][无剪枝]
    C++-LUOGU3834 可持久化线段树(主席树)[模板]
    BASIC-2 01字串
    【掌大】关注回复
    【掌大】纸飞机
  • 原文地址:https://www.cnblogs.com/alsodzy/p/10190822.html
Copyright © 2011-2022 走看看