JVM调优工具

4 篇文章 0 订阅

前言

给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括:运行日志、异常堆栈、GC日志、线程快照、堆转储快照等。经常使用适当的虚拟机监控和分析的工具可以加快我们分析数据、定位解决问题的速度。

目录

一、jps:虚拟机进程状况工具
二、jstat:虚拟机统计信息监视工具
三、jmap:Java内存印象工具
四、jhat:虚拟机堆转储快照分析工具
五、jstack:Java堆栈跟踪工具
六、jinfo:Java配置信息工具

JDK的命令行工具

JDK的bin目录下有很多用于监视虚拟机和故障处理的工具,这些工具都非常稳定而且功能强大,能在处理应用程序性能问题、定位故障是发挥很大的作用。比较细心的读者可能会注意到这些工具的程序体积都异常小巧。并非JDK开发团队刻意把它们制作得如此精炼来炫耀编程水平,而是因为这些命令行工具大多是jdk/lib/tools.jar类库的一层薄包装而已,它们主要的功能代码是在tools类库中实现的。

接下来介绍常用的一些工具

一、jps:虚拟机进程状况工具

JVM Process Status Tool ,显示置顶系统内的所有HotSpot虚拟机进程。

命令格式:
jps[options][hostid]

jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
jsp工具主要选项

项 作用
-l 输出主类全名或jar路径
-q 只输出LVMID
-m 输出JVM启动时传递给main()的参数
-v 输出JVM启动时显示指定的JVM参数

其中[ options ]、[ hostid ]参数也可以不写。

示例:

21332 org.tanukisoftware.wrapper.WrapperSimpleApp org.cellphone.gateway.WarehouseGateway
7516 kafka.Kafka config/server.properties
18140 sun.tools.jps.Jps -l -m

二、jstat:虚拟机统计信息监视工具jstat(JVM statistics Monitoring)是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。

命令格式:

jstat [ option vmid [interval[s|ms] [count]] ]

对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:

[protocol:][//]lvmid[@hostname[:port]/servername]

参数interval和count代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每250毫秒查询一次进程2764垃圾收集状况,一共查询20次,那命令应当是:

jstat -gc 2764 250 20

选项option代表着用户希望查询的虚拟机信息,主要分为3类:类装载、垃圾收集、运行期编译状况。

jstat工具主要选项:

选项作用
-class监视类装载、卸载数量、总空间以及类装载所耗费的时间
-gc监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量,已用空间、GC时间合计等信息
-gccapacity监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间
-gcutil监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比
-gccause与 -gcutil 功能一样,但是会额外输出导致上一次GC产生的原因
-gcnew监视新生代GC状况
-gcnewcapacity监视内容与 -gcnew 基本相同,输出主要关注使用到的最大、最小空间
-gcold监视老年代GC状况
-gcoldcapacity监视内容与 -gcold 基本相同,输出主要关注使用到的最大、最小空间
-gcpermcapacity输出永久代使用到的最大、最小空间
-compiler输出JIT编译器编译过的方法、耗时等信息
-printcompilation输出已经被JIT编译的方法

option参数详解

-class

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

$ ./jstat -class 21332
Loaded Bytes Unloaded Bytes Time
9263 16938.8 0 0.0 5.28

Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes : 未加载class的字节大小
Time : 加载时间

-compiler

输出JIT编译过的方法数量耗时等。

$ ./jstat -compiler 21332
Compiled Failed Invalid Time FailedType FailedMethod
10998 2 0 84.47 1 org/jboss/netty/channel/socket/nio/NioClientSocketPipelineSink$Boss run

Compiled : 编译数量
Failed : 编译失败数量
Invalid : 无效数量
Time : 编译耗时
FailedType : 失败类型
FailedMethod : 失败方法的全限定名

-gc

垃圾回收堆的行为统计,常用命令。

$ ./jstat -gc 21332
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
26176.0 26176.0 0.0 3352.3 209792.0 29733.0 262144.0 31656.1 53632.0 51814.7 6528.0 6124.3 417 3.690 0 0.000 3.690

C即Capacity 总容量,U即Used 已使用的容量

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 : 垃圾回收总消耗时间

$ ./jstat -gc 21332 2000 20

这个命令意思就是每隔2000ms输出1262的gc情况,一共输出20次。

-gccapacity

同-gc,不过还会输出Java堆各区域使用到的最大、最小空间。

$ ./jstat -gccapacity 21332
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
262144.0 262144.0 262144.0 26176.0 26176.0 209792.0 262144.0 262144.0 262144.0 262144.0 0.0 1095680.0 53632.0 0.0 1048576.0 6528.0 417 0

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

-gcutil

同-gc,不过输出的是已使用空间占总空间的百分比。

$ ./jstat -gcutil 21332
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 12.81 14.17 12.08 96.61 93.82 417 3.690 0 0.000 3.690

-gccause

垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。

$ ./jstat -gccause 21332
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 12.81 14.22 12.08 96.61 93.82 417 3.690 0 0.000 3.690 Allocation Failure No GC

LGCC:最近垃圾回收的原因
GCC:当前垃圾回收的原因

-gcnew

统计新生代的行为。

$ ./jstat -gcnew 21332
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
26176.0 26176.0 0.0 3352.3 6 6 13088.0 209792.0 30207.4 417 3.690

TT:Tenuring threshold(提升阈值)
MTT:最大的tenuring threshold
DSS:survivor区域大小 (KB)

-gcnewcapacity

新生代与其相应的内存空间的统计。

$ ./jstat -gcnewcapacity 21332
NGCMN NGCMX NGC S0CMX S0C S1CMX S1C ECMX EC YGC FGC
262144.0 262144.0 262144.0 26176.0 26176.0 26176.0 26176.0 209792.0 209792.0 417 0

NGC:当前年轻代的容量 (KB)
S0CMX:最大的S0空间 (KB)
S0C:当前S0空间 (KB)
ECMX:最大eden空间 (KB)
EC:当前eden空间 (KB)

-gcold

统计旧生代的行为。

$ ./jstat -gcold 21332
MC MU CCSC CCSU OC OU YGC FGC FGCT GCT
53632.0 51814.7 6528.0 6124.3 262144.0 31656.1 417 0 0.000 3.690

-gcoldcapacity

统计旧生代的大小和空间。

$ ./jstat -gcoldcapacity 21332
OGCMN OGCMX OGC OC YGC FGC FGCT GCT
262144.0 262144.0 262144.0 262144.0 417 0 0.000 3.690

-printcompilation

hotspot编译方法统计。

$ ./jstat -printcompilation 21332
Compiled Size Type Method
10998 2602 1 org/springframework/web/util/UrlPathHelper getPathWithinApplication

Compiled:被执行的编译任务的数量
Size:方法字节码的字节数
Type:编译类型
Method:编译方法的类名和方法名。类名使用"/" 代替 "." 作为空间分隔符. 方法名是给出类的方法名. 格式是一致于HotSpot - XX:+PrintComplation 选项

三、jmap:Java内存印象工具

jmap(JVM Memory Map)命令用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOutOfMemoryError参数来让虚拟机出现OOM的时候自动生成dump文件。jmap不仅能生成dump文件,还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器等。

命令格式:

jmap [ option ] vmid

jamp工具主要选项:

选项作用
-dump生成堆转储快照
-finalizerinfo显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
-heap显示Java堆详细信息
-histo显示堆中对象的统计信息
-permstat以ClassLoader为统计口径显示永久代内存状态。只在Linux/Solaris平台下有效
-F当-dump没有响应时,强制生成dump快照

option参数详解

-dump

常用格式:

-dump::live,format=b,file= pid

dump堆到文件,format指定输出格式,live指明是活着的对象,file指定文件名。

$ ./jmap -dump:live,format=b,file=dump.hprof 21332
Dumping heap to /home/ubuntu/app/jdk/bin/dump.hprof ...
Heap dump file created

dump.hprof这个后缀是为了后续可以直接用MAT(Memory Anlysis Tool)打开。

-finalizerinfo
打印等待回收对象的信息。

$ sudo ./jmap -finalizerinfo 21332
Attaching to process ID 21332, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
Number of objects pending for finalization: 0

可以看到当前F-QUEUE队列中并没有等待Finalizer线程执行finalizer方法的对象。

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

$ sudo ./jmap -heap 21332
Attaching to process ID 21332, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 536870912 (512.0MB)
   NewSize                  = 268435456 (256.0MB)
   MaxNewSize               = 268435456 (256.0MB)
   OldSize                  = 268435456 (256.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 134217728 (128.0MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 268435456 (256.0MB)
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 241631232 (230.4375MB)
   used     = 4158608 (3.9659576416015625MB)
   free     = 237472624 (226.47154235839844MB)
   1.721055662208435% used
Eden Space:
   capacity = 214827008 (204.875MB)
   used     = 4158608 (3.9659576416015625MB)
   free     = 210668400 (200.90904235839844MB)
   1.9357938458091823% used
From Space:
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
To Space:
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 268435456 (256.0MB)
   used     = 26038384 (24.832138061523438MB)
   free     = 242397072 (231.16786193847656MB)
   9.700053930282593% used

20159 interned Strings occupying 2604800 bytes.

可以很清楚的看到Java堆中各个区域目前的情况。

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

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值