第七篇:JVM系列 实用命令(jmap、jstat、jstack)

1. 前言

命令监控最方便,但是最优的方式是通过工具打开监控:比如jconsole、jvisualvm,几乎全部的信息都有了,另外jvisualvm支持远程监控,但是需要做一些配置

2. 使用命令的目的

  1. 获取垃圾回收器的类型和系统参数 // jmap -heap pid
  2. 查看应用启动的参数// jinfo -flags pid
  3. 查看当前各个代区的容量和使用量情况 // jstat
  4. FGC、YGC的总次数和总耗时 // jstat
  5. 立即生成Dump文件 //jmap -dump:live,file=dump_001.bin PID
  6. 强制FullGC // jmap -dump:live
  7. 查看线程的运行信息(包括死锁的线程) // jstack -l pid

3. jmap命令

3.1 heap pid

查看 JDK的概况的最好的一个参数
如果docker环境使用这些命令报错,请查看这里

  • JVM主要参数:垃圾回收器的类型、各种ratio、当前实际Size、MaxSize是多少
  • 当前各个代区的使用情况:Eden、From、To、Old区、Perm区
root@S-SI-APP-015-WSSB-TSYB:/opt/shbz# jmap -heap 1
Attaching to process ID 1, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.144-b01

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 2147483648 (2048.0MB)
   NewSize                  = 357564416 (341.0MB)
   MaxNewSize               = 715653120 (682.5MB)
   OldSize                  = 716177408 (683.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 658505728 (628.0MB)
   used     = 77369376 (73.78518676757812MB)
   free     = 581136352 (554.2148132324219MB)
   11.749233561716261% used
From Space:
   capacity = 28311552 (27.0MB)
   used     = 16720728 (15.946128845214844MB)
   free     = 11590824 (11.053871154785156MB)
   59.05973646375868% used
To Space:
   capacity = 28311552 (27.0MB)
   used     = 0 (0.0MB)
   free     = 28311552 (27.0MB)
   0.0% used
PS Old Generation
   capacity = 716177408 (683.0MB)
   used     = 206783872 (197.2044677734375MB)
   free     = 509393536 (485.7955322265625MB)
   28.87327493022511% used

54067 interned Strings occupying 5863792 bytes.
root@S-SI-APP-015-WSSB-TSYB:/opt/shbz#

参数解析:

  • 垃圾回收器:Parallel GC
  • MaxHeapSize是2G,默认是操作系统的1/4,32G*1/4=8G
  • 堆区低于40%,或者大于70% 会自动调整老年代的大小(但是不能低于xms的配置 2G,也不能高于 MaxSize 4G)

3.2 生成dump快照文件

生成快照文件,然后可以利用工具(比如jvisualvm)来分析dump包
dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名

root@S-SI-APP-015-WSSB-TSYB:/opt/shbz# jmap -dump:live,format=b,file=/opt/shbz/test20200120.dump 1
Dumping heap to /opt/shbz/test20200120.dump ...
Heap dump file created
root@S-SI-APP-015-WSSB-TSYB:/opt/shbz# ls
shbz-wssb.jar  test20200120.dump
root@S-SI-APP-015-WSSB-TSYB:/opt/shbz#

3.3 通过命令触发FullGC

jmap还有一个额外的功能,通过命令触发FullGC,比如可以执行定时任务,在业务低峰期执行,会自动触发FullGC
因为在*:live前会进行full gc,如果带上live则只统计活对象,因此不加live的堆大小要大于加live堆的大小

jmap -histo:live <pid>
jmap -dump:live,file=dump_001.bin PID

3.4 -histo:live 查看堆内存中有哪些对象

jmap -histo:live 1

4、jstat命令

4.1 gc

主要查看FGC、YGC的总次数和累计耗时
查看堆内各个代区的当前容量和当前使用量(当前容量不等于MaxCapactiy,当前容量是根据条件动态调整的),因为当前容量不等于Max容量所以在定位问题的时候,没有太多的使用价值

- S0C : survivor0区的总容量
- S1C : survivor1区的总容量
- S0U : survivor0区已使用的容量
- S1C : survivor1区已使用的容量
- EC : Eden区的总容量
- EU : Eden区已使用的容量
- OC : Old区的总容量
- OU : Old区已使用的容量
- PC 当前perm的容量 (KB)
- PU perm的使用 (KB)
- YGC : 新生代垃圾回收次数
- YGCT : 新生代垃圾回收时间
- FGC : 老年代垃圾回收次数
- FGCT : 老年代垃圾回收时间
- GCT : 垃圾回收总消耗时间

4.2 gcutil

功能和gc 一样,但是是百分比的形式,读取更友好

4.3 gccapacity

读取各个代区的当前容量、最大容量、当前使用量等信息

NGCMN : 新生代占用的最小空间
NGCMX : 新生代占用的最大空间
OGCMN : 老年代占用的最小空间
OGCMX : 老年代占用的最大空间
OGC:当前年老代的容量 (KB)
OC:当前年老代的空间 (KB)
PGCMN : perm占用的最小空间
PGCMX : perm占用的最大空间

4.4 命令的使用

./jstat -gc 91328
./jstat -gcutil 91328
./jstat -gccapacity 91328

5. jstack线程监控

详细的使用和线程dump文件分析博客
看这里

jstack -l pid >> stackLog.log //-l 表示包括线程死锁的信息
输出当前应用的线程使用信息,其中包括线程死锁的相关信息

发布了47 篇原创文章 · 获赞 0 · 访问量 1173

猜你喜欢

转载自blog.csdn.net/weixin_43103748/article/details/104051936