JVM调试命令

GC日志

打开GC日志

1
-server -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:./logs/gc.log

jmap

生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。

命令

1、jmap -histo[:live]
通过histo选项,打印当前java堆中各个对象的数量、大小。

如果添加了live,只会打印活跃的对象。

2、jmap -dump:[live,]format=b,file=
通过-dump选项,把java堆中的对象dump到本地文件,然后使用MAT进行分析。

如果添加了live,只会dump活跃的对象。

jmap -histo 19470 | jmap -histo:live 19470

3、jmap -heap
通过-heap选项,打印java堆的配置情况和使用情况,还有使用的GC算法。

jmap -heap 19470

4、jmap -finalizerinfo
通过-finalizerinfo选项,打印那些正在等待执行finalize方法的对象。

5、jmap -permstat
通过-permstat选项,打印java堆永久代的信息,包括class loader相关的信息,和interned Strings的信息。
`

实现原理

通过jmap和jvm之间进行通信,有两种实现方式:attach 和 SA。

attach

attach方式,简单来说就是客户端和服务端之间的通信,客户端发送请求,主要逻辑在服务端执行,jmap相当于客户端,JVM相当于服务端。

在JVM中,有一个叫”Attach Listener”的线程,专门负责监听attach的请求,并执行对应的操作。

客户端连接到目标JVM,向其发出一个类似“inspectheap”命令

目标JVM接收到命令,执行JVM内相关函数,将收集到的结果以文本形式返回

客户端接收到返回的文本并将其显示出来;

SA

假如执行”jmap -heap 5409″,就不会使用attach方式实现了。

在参数解析中,如果参数是”-heap|-heap:format=b|-permstat|-finalizerinfo”中的一种,或者添加了”-F”,比如”jmap -histo -F 5409″,则使用SA的方式。

SA方式,和attach方式不同的是,相关的主要逻辑都在SA中实现,从JVM中获取数据即可。

jps

只列出系统中所有的 Java 应用程序。
-q:只输出进程 ID
-m:输出传入 main 方法的参数
-l:输出完全的包名,应用主类名,jar的完全路径名
-v:输出jvm参数
-V:输出通过flag文件传递到JVM中的参数

jinfo

可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息。

jinfo 19470
输出当前 jvm 进程的全部参数和系统属性

参数说明

pid 对应jvm的进程id
executable core 产生core dump文件
[server-id@]remote server IP or hostname 远程的ip或者hostname,server-id标记服务的唯一性id

option
no option 输出全部的参数和系统属性
-flag name 输出对应名称的参数
-flag [+|-]name 开启或者关闭对应名称的参数
-flag name=value 设定对应名称的参数
-flags 输出全部的参数
-sysprops 输出系统属性

jstack

进程所包含线程情况查询 (位于”jdk_home/bin”目录下),可以实时监测系统资源占用与jvm运行情况。

jstack 19470
查看当前java进程的堆栈状态

参数说明:
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表.

-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息

-m 打印java和native c/c++框架的所有栈信息.

-h | -help 打印帮助信息

pid 需要被打印配置信息的java进程id,可以用jps查询.

jstat

jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:

jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]

// 命令语法结构:
Usage: jstat -help|-options
jstat -

S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor space 1 区已使用空间的百分比
E — Heap上的 Eden space 区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P — Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)
//示例
jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcmetacapacity
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcutil
-printcompilation
jstat -class -t 19470
Timestamp Loaded Bytes Unloaded Bytes Time
6188.4 3898 7178.4 40 58.3 1.78

jstat -gcutil 19470 1000 5

S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 25.00 98.55 15.37 96.94 94.88 21 0.069 7 0.237 0.306
0.00 25.00 99.59 15.37 96.94 94.88 21 0.069 7 0.237 0.306
0.00 25.00 99.59 15.37 96.94 94.88 21 0.069 7 0.237 0.306
0.00 25.00 100.00 15.37 96.94 94.88 21 0.069 7 0.237 0.306

------ 本文结束------

本文标题:JVM调试命令

文章作者:Perkins

发布时间:2019年09月25日

原始链接:https://perkins4j2.github.io/posts/9582/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。