JVM常用监控命令

曾经终败给现在 2023-07-15 07:59 120阅读 0赞

文章目录

  • jps查看虚拟机进程
  • jstat:虚拟机统计信息监控工具
  • jmap生成dump文件
  • jstack生成jvm当前时刻线程快照
  • jinfo:Java配置信息工具

jps查看虚拟机进程

jps(JVM Process Status Tool),功能和ps类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)的名称,以及这些进程的本地虚拟机的唯一ID(LVMID,Local Virtual Machine Identifier)。虽然功能比较单一,但它是使用频率最高的JDK命令行工具,因为其他JDK工具大多需要输入它查询到的LVMID来确定要监控的是哪一个虚拟机进程。对于本地虚拟机进程来说,LVMID与操作系统的进程ID(PID,Process Identifier)是一致的,使用windows的任务管理器或Unix的ps命令也可以查询到虚拟机进程的LVMID,但如果使用了多个虚拟机进程,无法根据进程名称定位时,那就只能依赖jps命令显示主类的功能区才能区分了。

option参数

  • -q 只显示pid,不显示class名称,jar文件名和传递给main方法的参数。
  • -l 输出应用程序main class的完成package名 或者 应用程序的jar文件完整路径名。
  • -m 输出传递给main方法的参数。
  • -v 输出传递给JVM的参数。

jstat:虚拟机统计信息监控工具

jstat(JVM Statistics Monitoring Tool)是用于监控虚拟机各种运行状态信息的命令行工具。它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据,在没有GUI图像界面,只提高了纯文本控制台环境的服务器上,它将是运行期定位虚拟机性能问题的首选工具。

jstat命令格式:
jstat [option vmid [interval[s|ms] [count]] ]

  • VMID与LVMID需要特别说明下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式是:[protocol:][//] lvmid [@hostname[:port]/servername]
  • 参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程10524垃圾收集情况,一共查询5次。
  • 选项option代表用户希望查询的虚拟机信息,主要分为三类:类装载、垃圾收集和运行期编译情况,具体选项及组用参见下表:
    在这里插入图片描述

例子:-gcutil

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jstat -gcutil 31638
  2. S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
  3. 2.25 0.00 37.44 84.72 94.32 92.65 450130 1271.632 35 4.972 1276.604

查询结果表明:新生代Eden区(E表示Eden区)使用了37.44%的空间,Surviver From使用了2.25%,To显然是空的(复制算法),老年代(O,表示Old)使用了84.72%,元空间(M,表示MetaSpace)使用了94.32%。程序运行以来共发生Minor GC(YGC,Young GC)450130次,总耗时(YGCT,Young GC Time)1271.632秒,发生Full GC 35次,耗时4.972秒,总垃圾收集时间1276.604秒。

-class
监视类装载、卸载数量、总空间以及耗费的时间。

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jstat -class 31638
  2. Loaded Bytes Unloaded Bytes Time
  3. 11489 21017.2 150 216.7 12.77
  • Loaded:加载class的数量
  • Bytes:class字节大小
  • Unloaded:未加载class的数量
  • Bytes:未加载class的字节大小
  • Time:加载时间

jmap生成dump文件

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现OOM的时候,自动生成dump文件。

jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。

option参数

  • dump:生成堆转储快照
  • finalizerinfo:显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
  • heap:显示Java堆详细信息
  • histo:显示堆中对象的统计信息

dump堆到文件,format指定输出格式,live指明是或者的对象,file指定文件名,dump.hprof这个后缀是为了后续可以直接用MAT(Memory Analysis Tool)打开。

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jmap -dump:live,format=b,file=dump.hprof 31638
  2. Dumping heap to /root/dump.hprof ...
  3. Heap dump file created

打印等待回收对象的信息

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jmap -finalizerinfo 31638
  2. Attaching to process ID 31638, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 25.231-b11
  6. Number of objects pending for finalization: 0

-heap
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况。

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jmap -heap 31638
  2. Attaching to process ID 31638, please wait...
  3. Debugger attached successfully.
  4. Server compiler detected.
  5. JVM version is 25.231-b11
  6. using thread-local object allocation.
  7. Mark Sweep Compact GC
  8. Heap Configuration: //堆内存初始化配置
  9. MinHeapFreeRatio = 40 // 对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
  10. MaxHeapFreeRatio = 70 // 对应jvm启动参数-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
  11. MaxHeapSize = 482344960 (460.0MB) // 对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
  12. NewSize = 10485760 (10.0MB) // 对应JVM启动参数-XX:NewSize=设置JVM堆的“新生代”的默认大小
  13. MaxNewSize = 160759808 (153.3125MB) // 对应jvm启动参数-XX:MaxNewSize=设置JVM堆的“新生代”的最大大小
  14. OldSize = 20971520 (20.0MB) // 对应jvm启动参数-XX:OldSize=设置JVM老年代的大小
  15. NewRatio = 2 // 对应jvm启动参数-XX:NewRatio=新生代和老年代的大小比率
  16. SurvivorRatio = 8 // 对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
  17. MetaspaceSize = 21807104 (20.796875MB) // 元空间初始大小
  18. CompressedClassSpaceSize = 1073741824 (1024.0MB)
  19. MaxMetaspaceSize = 17592186044415 MB // 最大元空间大小
  20. G1HeapRegionSize = 0 (0.0MB)
  21. Heap Usage: // 堆内存使用情况
  22. New Generation (Eden + 1 Survivor Space): // Eden和From区内存分配
  23. capacity = 22740992 (21.6875MB) // 总容量
  24. used = 14647472 (13.968917846679688MB) // 使用容量
  25. free = 8093520 (7.7185821533203125MB) // 空闲容量
  26. 64.40999583483429% used
  27. Eden Space:
  28. capacity = 20250624 (19.3125MB)
  29. used = 14543256 (13.869529724121094MB)
  30. free = 5707368 (5.442970275878906MB)
  31. 71.8163351410801% used
  32. From Space:
  33. capacity = 2490368 (2.375MB)
  34. used = 104216 (0.09938812255859375MB)
  35. free = 2386152 (2.2756118774414062MB)
  36. 4.184763055098684% used
  37. To Space:
  38. capacity = 2490368 (2.375MB)
  39. used = 0 (0.0MB)
  40. free = 2490368 (2.375MB)
  41. 0.0% used
  42. tenured generation: // 老年代使用情况
  43. capacity = 50417664 (48.08203125MB)
  44. used = 27490304 (26.216796875MB)
  45. free = 22927360 (21.865234375MB)
  46. 54.52514420342838% used
  47. 25717 interned Strings occupying 2690352 bytes.

打印堆的对象统计,包括对象数、内存大小等等(因为在dump:live前会进行full gc,如果带上live则只统计存活对象,因此不加live的堆大小要大于加live堆大小)

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jmap -histo:live 31638 | more
  2. num #instances #bytes class name
  3. ----------------------------------------------
  4. 1: 74591 7587536 [C
  5. 2: 6170 3007624 [I
  6. 3: 73987 1775688 java.lang.String
  7. 4: 19754 1738352 java.lang.reflect.Method
  8. 5: 51841 1658912 java.util.concurrent.ConcurrentHashMap$Node
  9. 6: 4428 1382176 [B
  10. 7: 12154 1347552 java.lang.Class
  11. 8: 17273 928336 [Ljava.lang.Object;
  12. 9: 16976 679040 java.util.LinkedHashMap$Entry
  13. 10: 6684 556688 [Ljava.util.HashMap$Node;
  14. 11: 10557 506736 org.aspectj.weaver.reflect.ShadowMatchImpl
  15. 12: 239 502528 [Ljava.util.concurrent.ConcurrentHashMap$Node;
  16. 13: 13909 445088 java.util.HashMap$Node
  17. 14: 26131 418096 java.lang.Object
  18. 15: 6492 363552 java.util.LinkedHashMap
  19. 16: 10557 337824 org.aspectj.weaver.patterns.ExposedState
  20. 17: 13718 296192 [Ljava.lang.Class;
  21. 18: 10772 258528 java.util.ArrayList
  22. 19: 3688 177024 java.util.HashMap
  23. 20: 2422 134856 [Ljava.lang.String;
  24. 21: 1574 125920 java.lang.reflect.Constructor
  25. 22: 4858 116592 org.springframework.core.MethodClassKey
  26. 23: 2737 109480 java.lang.ref.SoftReference
  27. 24: 6072 97152 org.apache.ibatis.scripting.xmltags.StaticTextSqlNod
  28. e
  29. 25: 1263 90936 java.lang.reflect.Field
  30. --More--

jmap -dump这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停使用。

jmap -histo:live这个命令执行,jvm会先触发gc,然后再统计信息。

jstack生成jvm当前时刻线程快照

jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当前运行的java程序的java stack和native stack的信息,如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

option参数

  • -F:当正常输出请求不被响应时,强制输出线程堆栈
  • -l:除堆栈外,显示关于锁的附件信息
  • -m:如果调用到本地方法的话,可以显示C/C++的堆栈

示例

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jstack -l 31638 | more
  2. 2020-03-16 09:17:17
  3. Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.231-b11 mixed mode):
  4. "Attach Listener" #32 daemon prio=9 os_prio=0 tid=0x00007f61c8011000 nid=0x3ea8
  5. waiting on condition [0x0000000000000000]
  6. java.lang.Thread.State: RUNNABLE
  7. Locked ownable synchronizers:
  8. - None
  9. "Druid-ConnectionPool-Destroy-1986617971" #31 daemon prio=5 os_prio=0 tid=0x0000
  10. 7f61c4278800 nid=0x7c89 waiting on condition [0x00007f61bc6d9000]
  11. java.lang.Thread.State: TIMED_WAITING (sleeping)
  12. at java.lang.Thread.sleep(Native Method)
  13. at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(Dr
  14. uidDataSource.java:2540)
  15. Locked ownable synchronizers:
  16. - None
  17. "Druid-ConnectionPool-Create-1986617971" #30 daemon prio=5 os_prio=0 tid=0x00007
  18. f61c477d800 nid=0x7c88 waiting on condition [0x00007f61bc7da000]
  19. java.lang.Thread.State: WAITING (parking)
  20. --More--

dump文件里,值得关注的线程状态有:

  • 死锁,DeadLock(重点关注)
  • 执行中,Runnable
  • 等待资源,Waiting on condition(重点关注)
  • 等待获取监视器,Waiting on monitor entry(重点关注)
  • 暂停,Suspended
  • 对象等待中,Object.wait()或TIMED_WAITING
  • 阻塞,Blocked(重点关注)
  • 停止,Parked

jinfo:Java配置信息工具

jinfo(JVM Configuration info)这个命令作用是实时查看和调整虚拟机运行参数。
之前的jps -v口令只能查看到显示指定的参数,如果想要查看未被显示指定的参数的值就要使用jinfo口令。

option参数

  • -flag:输出指定args参数的值
  • -flags:不需要args参数,输出所有JVM参数的值
  • sysprops:输出系统属性,等同于System.getProperties()

执行样例:查询CMSInitiatingOccupancyFraction参数值。

  1. [root@izuf6bsiti3f4kuichki8nz ~]# jinfo -flag CMSInitiatingOccupancyFraction 31638
  2. -XX:CMSInitiatingOccupancyFraction=-1

发表评论

表情:
评论列表 (有 0 条评论,120人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jvm监控命令总结

    前言 在生产环境中,为了保证Java应用的健康运行,需要动态检测应用运转过程中的各种指标,比较常见的像CPU利用率,内存使用,堆栈是否正常等 另一方面,生产环境中出现的

    相关 JVM命令

    JVM常用命令 1.jps 查看所有java应用程序; 2.jinfo 查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数

    相关 Linux监控命令

    top 命令 top 命令是性能监控程序,它可以在很多 Linux/Unix 版本下使用,并且它也是 Linux 系统管理员经常使用的监控系统性能的工具。Top 命令可以定期