• jcmd的使用


    官网文档:

    https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html

    官网介绍:

    The jcmd utility is used to send diagnostic(诊断 [ˌdaɪəɡˈnɑːstɪk]) command requests to the JVM, where these requests are useful for controlling Java Flight Recordings, troubleshoot, and diagnose JVM and Java Applications. It must be used on the same machine where the JVM is running, and have the same effective user and group identifiers that were used to launch the JVM.

    查看进程中的性能计数器

    jcmd <pid> PerfCounter.print
    

    例如:

    $ jcmd 30420 PerfCounter.print
    30420:
    java.ci.totalTime=49998630864
    java.cls.loadedClasses=15024
    java.cls.sharedLoadedClasses=0
    java.cls.sharedUnloadedClasses=0
    java.cls.unloadedClasses=152
    java.property.java.class.path="ewulian-server.jar"
    java.property.java.endorsed.dirs="/usr/local/lib/jdk/oracle/8u261/jre/lib/endorsed"
    java.property.java.ext.dirs="/usr/local/lib/jdk/oracle/8u261/jre/lib/ext:/usr/java/packages/lib/ext"
    java.property.java.home="/usr/local/lib/jdk/oracle/8u261/jre"
    java.property.java.library.path="/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib"
    java.property.java.version="1.8.0_261"
    ......
    

    查看可用的诊断命令

    jcmd <pid> help
    

    例如:

    $ jcmd 30420 help
    30420:
    The following commands are available:
    ManagementAgent.stop
    ManagementAgent.start_local
    ManagementAgent.start
    GC.rotate_log
    GC.class_stats
    GC.class_histogram
    GC.heap_dump
    GC.finalizer_info
    GC.heap_info
    GC.run_finalization
    GC.run
    ......
    

    VM.version

    命令:jcmd VM.version

    作用:打印jvm版本信息

    VM.uptime

    命令:jcmd VM.uptime

    作用:打印jvm已运行的秒数

    VM.command_line

    命令:jcmd VM.command_line

    作用:打印jvm启动的命令信息,即“java -jar xxx.jar”

    VM.dynlibs

    命令:jcmd VM.dynlibs

    作用:打印jvm已加载了哪些动态库(dynamic libraries)。这个比较有用,比如可以用这个查看jvm是否使用了glibc库,glibc库有一个64M缓存的问题,会导致java进程占用大量内存。

    例子:

    lenovo@lenovo-ThinkServer-TS80X:/usr/local/iot/ewulian$ jcmd 30420 VM.dynlibs
    30420:
    Dynamic libraries:
    a2400000-e0c00000 rw-p 00000000 00:00 0 
    ......
    # 这里表明jvm加载了glibc库
    7ff745034000-7ff74521b000 r-xp 00000000 fd:02 51383524 /lib/x86_64-linux-gnu/libc-2.27.so
    7ff74521b000-7ff74541b000 ---p 001e7000 fd:02 51383524 /lib/x86_64-linux-gnu/libc-2.27.so
    7ff74541b000-7ff74541f000 r--p 001e7000 fd:02 51383524 /lib/x86_64-linux-gnu/libc-2.27.so
    ......
    

    VM.flags

    命令:jcmd VM.flags

    作用:打印jvm使用了哪些虚拟机参数(VM flag options)

    例子:

    $ jcmd 30420 VM.flags
    30420:
    -XX:CICompilerCount=3 -XX:InitialHeapSize=524288000 -XX:MaxHeapSize=1572864000 -XX:MaxNewSize=524288000 -XX:MinHeapDeltaBytes=524288 -XX:NativeMemoryTracking=detail -XX:NewSize=174587904 -XX:OldSize=349700096 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
    

    VM.system_properties

    命令:jcmd VM.system_properties

    作用:打印jvm使用了哪些系统属性

    VM.classloader_stats

    命令:jcmd VM.classloader_stats

    作用:打印jvm使用了哪些Classloader

    VM.native_memory

    命令:jcmd VM.native_memory

    作用:打印jvm本地内存的使用情况

    该命令有更多选项,语法是:

    jcmd <pid> VM.native_memory [options]
    

    选项:(选项的形式是这样的: ,或者: =)
    summary : 显示内存分配的概况
    detail : 显示没存分配的详情
    baseline : 建立对比的基准线,使用summary.diff或detail.diff前调用该命令来建立基准线,后面使用summary.diff或detail.diff才能以此基准线做对比
    summary.diff : 显示内存分配的概况,跟基准线作对比
    detail.diff : 显示没存分配的详情,跟基准线作对比
    shutdown : 关闭Native Memory Tracking,释放占用的内存
    statistics : print tracker statistics for tuning purpose. (BOOLEAN, false)
    scale : 内存显示的单位:KB, MB or GB (STRING, KB)

    例子:

    $ jcmd 30420 VM.native_memory scale=MB
    30420:
    Native Memory Tracking:
    Total: reserved=3127MB, committed=1634MB
    -                 Java Heap (reserved=1500MB, committed=1215MB)
                                (mmap: reserved=1500MB, committed=1215MB) 
     
    -                     Class (reserved=1115MB, committed=102MB)
                                (classes #14872)
                                (malloc=7MB #29150) 
                                (mmap: reserved=1108MB, committed=95MB) 
     
    -                    Thread (reserved=76MB, committed=76MB)
                                (thread #76)
                                (stack: reserved=75MB, committed=75MB)
     
    -                      Code (reserved=254MB, committed=61MB)
                                (malloc=11MB #14653) 
                                (mmap: reserved=244MB, committed=50MB) 
     
    -                        GC (reserved=60MB, committed=60MB)
                                (malloc=6MB #357) 
                                (mmap: reserved=55MB, committed=54MB) 
     
    -                  Internal (reserved=96MB, committed=96MB)
                                (malloc=96MB #20794) 
     
    -                    Symbol (reserved=20MB, committed=20MB)
                                (malloc=17MB #178565) 
                                (arena=3MB #1)
     
    -    Native Memory Tracking (reserved=4MB, committed=4MB)
                                (tracking overhead=4MB)
    

    关于 reserved 和 committed 的理解

    JFR相关

    JFR是 Java Fly Record的意思,是Java平台性能分析和事件采集的框架。JFR是商用的特性所以需要解锁才能使用。我们可以先检查一下是否解锁了。

    检查:

    $ jcmd 30420 VM.check_commercial_features
    30420:
    Commercial Features are locked.
    

    解锁:

    $ jcmd 30420 VM.unlock_commercial_features
    30420:
    Commercial Features now unlocked.
    

    运行JFR相关命令:

    • JFR.start
    • JFR.stop
    • JFR.check
    • JFR.dump

    Thread.print

    作用:打印线程信息

    GC.heap_dump

    作用:生成堆转存快照,HPROF格式,可以使用Eclipse Memory Analyzer打开分析

    GC.heap_info

    作用:查看堆信息

    例子:

    $ jcmd 26590 GC.heap_info
    26590:
     PSYoungGen      total 377344K, used 226109K [0x00000000e0c00000, 0x0000000100000000, 0x0000000100000000)
      eden space 356864K, 63% used [0x00000000e0c00000,0x00000000ee8cf440,0x00000000f6880000)
      from space 20480K, 0% used [0x00000000f6880000,0x00000000f6880000,0x00000000f7c80000)
      to   space 22016K, 0% used [0x00000000fea80000,0x00000000fea80000,0x0000000100000000)
     ParOldGen       total 444928K, used 36644K [0x00000000a2400000, 0x00000000bd680000, 0x00000000e0c00000)
      object space 444928K, 8% used [0x00000000a2400000,0x00000000a47c9360,0x00000000bd680000)
     Metaspace       used 67056K, capacity 70446K, committed 70744K, reserved 1112064K
      class space    used 7967K, capacity 8541K, committed 8576K, reserved 1048576K
    
    
  • 相关阅读:
    C# 序列化技术详解《转》
    DataGridView中的DataGridViewComboBoxColumn使用浅析
    取EXCEL文件的3种方法
    教你几种在SQLServer中删除重复数据方法
    事件浅析
    迭代委托链
    C#调用耗时函数时显示进度条浅探
    启动公告【过时】
    在Web应用中接入微信支付的流程之极简清晰版
    VBoxManage: error: Cannot register the hard disk 解决办法
  • 原文地址:https://www.cnblogs.com/caibh/p/13787158.html
Copyright © 2020-2023  润新知