• jvm 性能调优工具之 jcmd


    概述

    在JDK1.7以后,新增了一个命令行工具 jcmd。他是一个多功能的工具,可以用它来导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析(jmc 工具的飞行记录器)。

    命令格式

    1   jcmd <pid | main class> <command ... | PerfCounter.print | -f  file>
    2   jcmd -l
    3   jcmd -h

    描述

    • pid:接收诊断命令请求的进程ID。
      main class :接收诊断命令请求的进程的main类。匹配进程时,main类名称中包含指定子字符串的任何进程均是匹配的。如果多个正在运行的Java进程共享同一个main类,诊断命令请求将会发送到所有的这些进程中。

    • command:接收诊断命令请求的进程的main类。匹配进程时,main类名称中包含指定子字符串的任何进程均是匹配的。如果多个正在运行的Java进程共享同一个main类,诊断命令请求将会发送到所有的这些进程中。

      注意: 如果任何参数含有空格,你必须使用英文的单引号或双引号将其包围起来。 此外,你必须使用转义字符来转移参数中的单引号或双引号,以阻止操作系统shell处理这些引用标记。当然,你也可以在参数两侧加上单引号,然后在参数内使用双引号(或者,在参数两侧加上双引号,在参数中使用单引号)。

    • Perfcounter.print:打印目标Java进程上可用的性能计数器。性能计数器的列表可能会随着Java进程的不同而产生变化。

    • -f file:从文件file中读取命令,然后在目标Java进程上调用这些命令。在file中,每个命令必须写在单独的一行。以"#"开头的行会被忽略。当所有行的命令被调用完毕后,或者读取到含有stop关键字的命令,将会终止对file的处理。

    • -l:查看所有的进程列表信息。

    • -h:查看帮助信息。(同 -help)

    查看进程 jcmd -l

    命令:jcmd -l
    描述:查看 当前机器上所有的 jvm 进程信息

    1   jcmd 
    2   jcmd -l
    3   jps 

    这三个命令的效果是一样的

    查看性能统计

    命令:jcmd pid PerfCounter.print
    描述:查看指定进程的性能统计信息。

     1 C:Windowssystem32>jcmd 9592 PerfCounter.print
     2 9592:
     3 java.ci.totalTime=16704
     4 java.cls.loadedClasses=438
     5 java.cls.sharedLoadedClasses=0
     6 java.cls.sharedUnloadedClasses=0
     7 java.cls.unloadedClasses=0
     8 java.property.java.class.path="D:workgit	est	argetclasses"
     9 java.property.java.endorsed.dirs="D:Program FilesJavajre1.8.0_91libendorsed"
    10 java.property.java.ext.dirs="D:Program FilesJavajre1.8.0_91libext;C:WindowsSunJavalibext"
    11 java.property.java.home="D:Program FilesJavajre1.8.0_91"
    12 ...

    列出当前运行的 java 进程可以执行的操作

    命令:jcmd PID help

     1 C:Windowssystem32>jcmd 9592 help
     2 9592:
     3 The following commands are available:
     4 JFR.stop
     5 JFR.start
     6 JFR.dump
     7 JFR.check
     8 VM.native_memory
     9 VM.check_commercial_features
    10 VM.unlock_commercial_features
    11 ManagementAgent.stop
    12 ManagementAgent.start_local
    13 ManagementAgent.start
    14 GC.rotate_log
    15 Thread.print
    16 GC.class_stats
    17 GC.class_histogram
    18 GC.heap_dump
    19 GC.run_finalization
    20 GC.run
    21 VM.uptime
    22 VM.flags
    23 VM.system_properties
    24 VM.command_line
    25 VM.version
    26 help

    查看具体命令的选项

    如果想查看命令的选项,比如想查看 JFR.dump 命令选项,可以通过如下命令:
    jcmd 11772 help JFR.dump

    1.JRF 相关命令

    JRF 功能跟 jmc.exe 工具的飞行记录器的功能一样的。
    要使用 JRF 相关的功能,必须使用 VM.unlock_commercial_features 参数取消锁定商业功能 。

     

    • 启动JFR
      执行命令:jcmd $PID JFR.start name=abc,duration=120s

    • Dump JFR
      等待至少duration(本文设定120s)后,执行命令:jcmd PID JFR.dump name=abc,duration=120s filename=abc.jfr(注意,文件名必须为.jfr后缀)

    • 检查JFR状态
      执行命令:jcmd $PID JFR.check name=abc,duration=120s

    • 停止JFR
      执行命令:jcmd $PID JFR.stop name=abc,duration=120s

    • JMC分析
      切回开发机器,下载步骤3中生成的abc.jfr,打开jmc,导入abc.jfr即可进行可视化分析

    VM.uptime

    命令:jcmd PID VM.uptime
    描述:查看 JVM 的启动时长:

    GC.class_histogram

    命令:jcmd PID GC.class_histogram
    描述:查看系统中类统计信息

    这里和jmap -histo pid的效果是一样的
    这个可以查看每个类的实例数量和占用空间大小。

    Thread.print

    命令:jcmd PID Thread.print
    描述:查看线程堆栈信息。

    该命令同 jstack 命令。

    GC.heap_dump

    命令:jcmd PID GC.heap_dump FILE_NAME
    描述:查看 JVM 的Heap Dump

    1 C:Usersjjs>jcmd 10576 GC.heap_dump d:dump.hprof
    2 10576:
    3 Heap dump file created

    跟 jmap命令:jmap -dump:format=b,file=heapdump.phrof pid 效果一样。
    导出的 dump 文件,可以使用MAT 或者 Visual VM 等工具进行分析。

    注意:如果只指定文件名,默认会生成在启动 JVM 的目录里。

    VM.system_properties

    命令:jcmd PID VM.system_properties
    描述:查看 JVM 的属性信息

     1 C:Usersjjs>jcmd 10576 VM.system_properties
     2 10576:
     3 #Wed Jan 31 22:30:20 CST 2018
     4 java.vendor=Oracle Corporation
     5 osgi.bundles.defaultStartLevel=4
     6 ......
     7 os.version=10.0
     8 osgi.arch=x86_64
     9 path.separator=;
    10 java.vm.version=25.91-b15
    11 org.osgi.supports.framework.fragment=true
    12 user.variant=
    13 osgi.framework.shape=jar
    14 java.awt.printerjob=sun.awt.windows.WPrinterJob
    15 osgi.instance.area.default=file:/C:/Users/jjs/eclipse-workspace/
    16 sun.io.unicode.encoding=UnicodeLittle
    17 org.osgi.framework.version=1.8.0
    18 ......

    VM.flags

    命令:jcmd PID VM.flags
    描述:查看 JVM 的启动参数

    1 C:Usersjjs>jcmd 10576 VM.flags
    2 10576:
    3 -XX:CICompilerCount=3 -XX:ConcGCThreads=1 
    4 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=268435456 
    5 -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1073741824 
    6 -XX:MaxNewSize=643825664 -XX:MinHeapDeltaBytes=1048576 
    7 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops 
    8 -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 
    9 -XX:-UseLargePagesIndividualAllocation -XX:+UseStringDeduplication

    VM.command_line

    命令:jcmd PID VM.command_line
    描述:查看 JVM 的启动命令行

    1 C:Usersjjs>jcmd 10576 VM.command_line
    2 10576:
    3 VM Arguments:
    4 jvm_args: -Dosgi.requiredJavaVersion=1.8 
    5 -Dosgi.instance.area.default=@user.home/eclipse-workspace 
    6 -XX:+UseG1GC -XX:+UseStringDeduplication 
    7 -Dosgi.requiredJavaVersion=1.8 -Xms256m -Xmx1024m
    8 java_command: <unknown>
    9 java_class_path (initial): D:	ool...org.eclipse.equinox.launcher.jar

    GC.run_finalization

    命令:jcmd PID GC.run_finalization
    描述: 对 JVM 执行 java.lang.System.runFinalization()

    1 C:Usersjjs>jcmd 10576 GC.run_finalization
    2 10576:
    3 Command executed successfully

    执行一次finalization操作,相当于执行java.lang.System.runFinalization()

    GC.run

    命令:jcmd PID GC.run
    描述:对 JVM 执行 java.lang.System.gc()

    1 C:Usersjjs>jcmd 10576 GC.run
    2 10576:
    3 Command executed successfully

    告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的。

    PerfCounter.print

    命令:jcmd PID PerfCounter.print
    描述:查看 JVM 性能相关的参数

    1 C:Usersjjs>jcmd 10576 PerfCounter.print
    2 10576:
    3 java.ci.totalTime=93024843
    4 java.cls.loadedClasses=18042
    5 java.cls.sharedLoadedClasses=0
    6 java.cls.sharedUnloadedClasses=0
    7 java.cls.unloadedClasses=3
    8 ......

    VM.version

    命令:jcmd PID VM.version
    描述:查看目标jvm进程的版本信息

    1 C:Usersjjs>jcmd 10576 VM.version
    2 10576:
    3 Java HotSpot(TM) 64-Bit Server VM version 25.91-b15
    4 JDK 8.0_91
  • 相关阅读:
    面试官:你和队友之间选一个淘汰,你怎么选?
    Spring Boot 如何干掉 if else?
    坑爹的 Java 可变参数,把我整得够惨。。
    厉害了,程序员的高考试卷,你能拿几分?
    6个步骤,全方位掌握 Kafka
    程序员逛酒吧,喝酒不是主要的。。
    图解 Java 垃圾回收机制,写得非常好!
    冲上云霄,Dubbo Go!
    人工智能都能写Java了!这款插件让你编程更轻松
    说了多少遍,姿势要对!
  • 原文地址:https://www.cnblogs.com/lgjava/p/12180791.html
Copyright © 2020-2023  润新知