JVM常用监控命令
文章目录
- 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
[root@izuf6bsiti3f4kuichki8nz ~]# jstat -gcutil 31638
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
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
监视类装载、卸载数量、总空间以及耗费的时间。
[root@izuf6bsiti3f4kuichki8nz ~]# jstat -class 31638
Loaded Bytes Unloaded Bytes Time
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)打开。
[root@izuf6bsiti3f4kuichki8nz ~]# jmap -dump:live,format=b,file=dump.hprof 31638
Dumping heap to /root/dump.hprof ...
Heap dump file created
打印等待回收对象的信息
[root@izuf6bsiti3f4kuichki8nz ~]# jmap -finalizerinfo 31638
Attaching to process ID 31638, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.231-b11
Number of objects pending for finalization: 0
-heap
打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况,可以用此来判断内存目前的使用情况以及垃圾回收情况。
[root@izuf6bsiti3f4kuichki8nz ~]# jmap -heap 31638
Attaching to process ID 31638, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.231-b11
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration: //堆内存初始化配置
MinHeapFreeRatio = 40 // 对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 70 // 对应jvm启动参数-XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 482344960 (460.0MB) // 对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 10485760 (10.0MB) // 对应JVM启动参数-XX:NewSize=设置JVM堆的“新生代”的默认大小
MaxNewSize = 160759808 (153.3125MB) // 对应jvm启动参数-XX:MaxNewSize=设置JVM堆的“新生代”的最大大小
OldSize = 20971520 (20.0MB) // 对应jvm启动参数-XX:OldSize=设置JVM老年代的大小
NewRatio = 2 // 对应jvm启动参数-XX:NewRatio=新生代和老年代的大小比率
SurvivorRatio = 8 // 对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
MetaspaceSize = 21807104 (20.796875MB) // 元空间初始大小
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB // 最大元空间大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage: // 堆内存使用情况
New Generation (Eden + 1 Survivor Space): // Eden和From区内存分配
capacity = 22740992 (21.6875MB) // 总容量
used = 14647472 (13.968917846679688MB) // 使用容量
free = 8093520 (7.7185821533203125MB) // 空闲容量
64.40999583483429% used
Eden Space:
capacity = 20250624 (19.3125MB)
used = 14543256 (13.869529724121094MB)
free = 5707368 (5.442970275878906MB)
71.8163351410801% used
From Space:
capacity = 2490368 (2.375MB)
used = 104216 (0.09938812255859375MB)
free = 2386152 (2.2756118774414062MB)
4.184763055098684% used
To Space:
capacity = 2490368 (2.375MB)
used = 0 (0.0MB)
free = 2490368 (2.375MB)
0.0% used
tenured generation: // 老年代使用情况
capacity = 50417664 (48.08203125MB)
used = 27490304 (26.216796875MB)
free = 22927360 (21.865234375MB)
54.52514420342838% used
25717 interned Strings occupying 2690352 bytes.
打印堆的对象统计,包括对象数、内存大小等等(因为在dump:live前会进行full gc,如果带上live则只统计存活对象,因此不加live的堆大小要大于加live堆大小)
[root@izuf6bsiti3f4kuichki8nz ~]# jmap -histo:live 31638 | more
num #instances #bytes class name
----------------------------------------------
1: 74591 7587536 [C
2: 6170 3007624 [I
3: 73987 1775688 java.lang.String
4: 19754 1738352 java.lang.reflect.Method
5: 51841 1658912 java.util.concurrent.ConcurrentHashMap$Node
6: 4428 1382176 [B
7: 12154 1347552 java.lang.Class
8: 17273 928336 [Ljava.lang.Object;
9: 16976 679040 java.util.LinkedHashMap$Entry
10: 6684 556688 [Ljava.util.HashMap$Node;
11: 10557 506736 org.aspectj.weaver.reflect.ShadowMatchImpl
12: 239 502528 [Ljava.util.concurrent.ConcurrentHashMap$Node;
13: 13909 445088 java.util.HashMap$Node
14: 26131 418096 java.lang.Object
15: 6492 363552 java.util.LinkedHashMap
16: 10557 337824 org.aspectj.weaver.patterns.ExposedState
17: 13718 296192 [Ljava.lang.Class;
18: 10772 258528 java.util.ArrayList
19: 3688 177024 java.util.HashMap
20: 2422 134856 [Ljava.lang.String;
21: 1574 125920 java.lang.reflect.Constructor
22: 4858 116592 org.springframework.core.MethodClassKey
23: 2737 109480 java.lang.ref.SoftReference
24: 6072 97152 org.apache.ibatis.scripting.xmltags.StaticTextSqlNod
e
25: 1263 90936 java.lang.reflect.Field
--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++的堆栈
示例
[root@izuf6bsiti3f4kuichki8nz ~]# jstack -l 31638 | more
2020-03-16 09:17:17
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.231-b11 mixed mode):
"Attach Listener" #32 daemon prio=9 os_prio=0 tid=0x00007f61c8011000 nid=0x3ea8
waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"Druid-ConnectionPool-Destroy-1986617971" #31 daemon prio=5 os_prio=0 tid=0x0000
7f61c4278800 nid=0x7c89 waiting on condition [0x00007f61bc6d9000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.alibaba.druid.pool.DruidDataSource$DestroyConnectionThread.run(Dr
uidDataSource.java:2540)
Locked ownable synchronizers:
- None
"Druid-ConnectionPool-Create-1986617971" #30 daemon prio=5 os_prio=0 tid=0x00007
f61c477d800 nid=0x7c88 waiting on condition [0x00007f61bc7da000]
java.lang.Thread.State: WAITING (parking)
--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参数值。
[root@izuf6bsiti3f4kuichki8nz ~]# jinfo -flag CMSInitiatingOccupancyFraction 31638
-XX:CMSInitiatingOccupancyFraction=-1
还没有评论,来说两句吧...