JVM 虚拟机监控 命令

 jps :打印出所有正在运行 的java进程的相关信息。

  • jps 打印的信息包含java进程ID和主类名。-l 打印出主类所在的包名。

$jps -l
320 sun.tools.jps.Jps
118 org.apache.catalina.startup.Bootstrap
  • -m 传给主类的参数 -v 传给java虚拟机的参数
  • $ jps -mlv
    3210 sun.tools.jps.Jps -mlv -Denv.class.path=/opt/java/jdk1.8.0_172/lib/ -Dapplication.home=/opt/java/jdk1.8.0_172 -Xms8m
    
  • 注意:如果java进程开启了UsePerfData参数(XX: - UsePerfData),则这些命令则无法探知java进程。
  • jstat : java进程性能相关信息。具体命令信息官网: https://docs.oracle.com/en/java/javase/11/tools/jstat.html#GUID-5F72A7F9-5D5A-4486-8201-E1D1BA8ACCB5
    $ jstat -options
    -class  // 打印类加载相关信息
    -compiler //即时编译相关信息
    -gc     // 打印gc相关信息
    -gccapacity
    -gccause
    -gcmetacapacity
    -gcnew
    -gcnewcapacity
    -gcold
    -gcoldcapacity
    -gcutil
    -printcompilation // 即时编译先关信息
    
  • jstat 一般只会执行一次,按照如下命令可以指定执行次数。
    # Usage: jstat -outputOptions [-t] [-hlines] VMID [interval [count]]
    $ jstat -gc 11978 1s 3
    // KB 单位
    // s0C  代表第一个survivor区总容量,     S1C 代表第二个。
    // S0U  代表第一个survivor区已使用总容量 S1U 代表第二个
    // EC   代表Eden区总容量,就是年轻代      EU 代表已使用容量
    // OC   代表Old区总容量,就是年老代。     OU 代表已使用容量
    // MC   代表元数据区总容量就是永久代      MU 代表已使用容量
    // CCSC 代表压缩类空间容量             CCMU 代表已使用容量
    // YGC  代表年轻代垃圾回收次数    
    // YGCT 代表年轻代垃圾回收时间 
    // FGC  FULL GC  次数,就是指对整个java堆进行垃圾回收,包括年轻代和年老代
    // FGCT  FULL GC 回收时间
    // GCT  总的垃圾回收消耗的时间    
     S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    512.0  512.0   32.0   0.0   15360.0   8579.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    512.0  512.0   32.0   0.0   15360.0   8579.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    512.0  512.0   32.0   0.0   15360.0   8579.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    
  • -t  一个常用的参数,可以打印出java进程启动的时间。下面标识该java进程启动了1977311.4秒。
    $ jstat -gc -t  11978
    Timestamp        S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
    1977311.4        512.0  512.0   32.0   0.0   15360.0  13481.4   20480.0    17882.5   19712.0 18988.7 2304.0 2053.9    384    0.757   0      0.000    0.757
    
  • 这样就可以判断出GC 时间占用运行时间比例,超过20%则说明堆压力较大,超过90%则很可能会发生ooM.多次监控年老代的OU 列则可以看出是否发生内存泄漏,即OU不断在增长。

jmap : 分析堆中对象的状态 

  • 官方帮助文档:https://docs.oracle.com/en/java/javase/11/tools/jmap.html#GUID-D2340719-82BA-4077-B0F3-2803269B7F41
  • 子命令:
    -clstats  打印类加载信息
    
    -finalizerinfo 打印所有待finalizer 的对象
    
    -histo  打印各个类的实例数目及占用内存,并按照内存使用量降序排序。
    
    -histo:live  打印堆中存活对象信息
    
    -dump  导出java虚拟机内存快照,常用也是-dump:live 只保存存活对象
    
  • 常用命令 jmap  -dump:live ,format = b, the file = filename. Bin 导出到一个文件里进行查看。
    打印出的信息一部分:
    
    $ jmap -histo 978
     num        #instances         #bytes  class name (module) 
    
    1543:             1             16  sun.security.x509.RFC822Name
    1544:             1             16  sun.text.normalizer.NormalizerBase$Mode
    1545:             1             16  sun.text.normalizer.NormalizerBase$NFCMode
    1546:             1             16  sun.text.normalizer.NormalizerBase$NFDMode
    1547:             1             16  sun.text.normalizer.NormalizerBase$NFKCMode
  • jinfo :用来查看java进程的参数  

  • 官方文档:https://docs.oracle.com/en/java/javase/11/tools/jinfo.html#GUID-69246B58-28C4-477D-B375-278F5F9830A5
  • 具体来看就是传给虚拟机的一些参数,比如 -XX  可以看到自己设置的或者默认设置一些信息。
    $ jinfo 119
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.172-b11
    Java System Properties:
    
    ...
    ...
    ...
    
    VM Flags:
    Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=31457280 -XX:MaxHeapSize=482344960 -XX:MaxNewSize=160432128 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=10485760 -XX:OldSize=20971520 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 
    
    
    
  • jstack :打印进程的各个线程的信息,包括线程的锁。

  • 官方文档:https://docs.oracle.com/en/java/javase/11/tools/jstack.html#GUID-721096FC-237B-473C-A461-DBBBB79E4F6A
  • 那这里就可以使用jstack来进行死锁检查。
  • 一个死锁:来自于郑雨笛老师
    $ jstack 31634
    ...
    
    "Thread-0" #12 prio=5 os_prio=31 cpu=1.32ms elapsed=34.24s tid=0x00007fb08601c800 nid=0x5d03 waiting for monitor entry  [0x000070000bc7e000]
       java.lang.Thread.State: BLOCKED (on object monitor)
     at DeadLock.foo(DeadLock.java:18)
     - waiting to lock <0x000000061ff904c0> (a java.lang.Object)
     - locked <0x000000061ff904b0> (a java.lang.Object)
     at DeadLock$$Lambda$1/0x0000000800060840.run(Unknown Source)
     at java.lang.Thread.run(java.base@11/Thread.java:834)
    
    "Thread-1" #13 prio=5 os_prio=31 cpu=1.43ms elapsed=34.24s tid=0x00007fb08601f800 nid=0x5f03 waiting for monitor entry  [0x000070000bd81000]
       java.lang.Thread.State: BLOCKED (on object monitor)
     at DeadLock.bar(DeadLock.java:33)
     - waiting to lock <0x000000061ff904b0> (a java.lang.Object)
     - locked <0x000000061ff904c0> (a java.lang.Object)
     at DeadLock$$Lambda$2/0x0000000800063040.run(Unknown Source)
     at java.lang.Thread.run(java.base@11/Thread.java:834)
    
    ...
    
    JNI global refs: 6, weak refs: 0
    
    
    Found one Java-level deadlock:
    =============================
    "Thread-0":
      waiting to lock monitor 0x00007fb083015900 (object 0x000000061ff904c0, a java.lang.Object),
      which is held by "Thread-1"
    "Thread-1":
      waiting to lock monitor 0x00007fb083015800 (object 0x000000061ff904b0, a java.lang.Object),
      which is held by "Thread-0"
    
    Java stack information for the threads listed above:
    ===================================================
    "Thread-0":
     at DeadLock.foo(DeadLock.java:18)
     - waiting to lock <0x000000061ff904c0> (a java.lang.Object)
     - locked <0x000000061ff904b0> (a java.lang.Object)
     at DeadLock$$Lambda$1/0x0000000800060840.run(Unknown Source)
     at java.lang.Thread.run(java.base@11/Thread.java:834)
    "Thread-1":
     at DeadLock.bar(DeadLock.java:33)
     - waiting to lock <0x000000061ff904b0> (a java.lang.Object)
     - locked <0x000000061ff904c0> (a java.lang.Object)
     at DeadLock$$Lambda$2/0x0000000800063040.run(Unknown Source)
     at java.lang.Thread.run(java.base@11/Thread.java:834)
    
    Found 1 deadlock.
    
  • jcmd :可以实现除了jstat 以外以上所有的命令

  • 官方文档:https://docs.oracle.com/en/java/javase/11/tools/jcmd.html#GUID-59153599-875E-447D-8D98-0078A5778F05
  • 总结:
    • jps  打印所有java进程Id及一些相关的信息,比如主类,主类所在的包等
    • jstat  打印java进程的的类加载及gc信息
    • jmap  打印对象的信息,比如类的实例数目,类所有实例占用内存大小。常用来查看占用内存过大的对象。
    • jinfo 打印java进程的配置参数,常用的-XX 及各种设定的参数。也可以修改参数值
    • jstack  打印java进程的各个线程信息,及线程的锁。哟哪里检测死锁
    • jcmd  实现出jstat以外的上述功能

猜你喜欢

转载自blog.csdn.net/m0_37948170/article/details/85014320