JVM性能优化之JVM调试
文章目录
- JVM性能优化之JVM调试
- 前言
- 一、jps
- 二、 jinfo
- 三、 jstat
- 四、 jstack
- 五、 jmap
- 六、 jhat
前言
前面文章简单的对JVM进行了简单的讲解,本文来简单讲解一下一些在JVM调试过程中使用到的操作命令。
一、jps
jps是JDK 1.5提供的一个显示当前所有java进程pid的命令,相当于Java版本的ps命令,可以查看Java进程及其相关信息。在windows的CMD或者Linux都可以直接输入命令查看相关信息。
jps [options] [hostid]
jps有以下参数:
option | 参数详情 |
-l | 显示进程id,显示主类全名或jar路径。 |
-q | 显示进程id。 |
-m | 显示进程id, 显示JVM启动时传递给main()的参数。 |
-v | 显示进程id,显示JVM启动时显示指定的JVM参数。 |
写一个死循环代码保持测试代码执行中
public static void main(String[] args){
while (true){
System.out.println("测试");
}
}
使用jps -v命令查看当前代码的JVM参数配置信息。
二、 jinfo
jinfo是用来查看JVM参数以及动态修改部分JVM参数的命令,也是JDK中自带的。
jinfo [option] <pid> //查看运行中的程序,pid为程序进程号
jinfo [option] <executable <core> //查看javadump文件信息,代码崩溃的时候会产生对应的dump文件
jinfo [option] [server_id@]<remote server IP or hostname> //远程查看服务信息
jinfo有以下参数(不填写默认输出所有的系统属性和参数):
option | 参数详情 |
-flag | 打印指定名称的参数 |
-flag[+/-] | 打开或关闭参数 |
-flag= | 设置参数 |
-flags | 打印所有参数 |
-sysprops | 打印系统设置 |
使用jinfo直接填写上面jps获取的测试代码的进程ID看一下结果:
三、 jstat
jstat也是JDK自带的JVM查看命令,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,来查看JVM运行时的状态信息,包括内存状态、垃圾回收等。
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] //后面两个是间隔时间和查询次数
jstat有以下参数:
option | 参数详情 |
-class | 查看类加载器的信息 |
-compiler | 查看JIT编译器的信息 |
-gc | 垃圾回收的信息 |
-gccapacity | 各垃圾回收代相应的信息 |
-gcutil | 垃圾回收主要信息 |
-gccause | 垃圾回收主要信息及最近两次垃圾回收的原因 |
-gcnew | 新生代垃圾回收信息 |
-gcnewcapacity | 新生代与其相应的内存空间信息 |
-gcold | 老年代垃圾回收信息 |
-gcoldcapacity | 老年代及其相应的内存空间信息 |
printcompilation | HotSpot编译方法统计 |
使用jstat查看上面代码的垃圾回收信息:
GC对应信息参照:
代码 | 具体含义 |
S0C | survivor0大小 |
S1C | survivor1大小 |
S0U | survivor0已使用大小 |
S1U | survivor1已使用大小 |
EC | Eden区大小 |
EU | Eden区已使用大小 |
OC | 老年代大小 |
OU | 老年代已使用大小 |
MC | 方法区大小 |
MU | 方法区已使用大小 |
CCSC | 压缩类空间大小 |
CCSU | 压缩类空间已使用大小 |
YGC | 年轻代垃圾回收次数 |
YGCT | 年轻代垃圾回收消耗时间 |
FGC | Full GC垃圾回收次数 |
FGCT | Full GC垃圾回收消耗时间 |
GCT | 垃圾回收消耗总时间 |
四、 jstack
jstack是用来查看JVM线程快照的命令,线程快照指的是JVM线程正在执行的方法堆栈集合。使用jstack命令可以定
位线程出现长时间卡顿的原因,例如死锁,死循环等。jstack还可以查看程序崩溃时生成的core文件中的stack信
息。
jstack [-l] <pid>
jstack -F [-m] [-l] <pid>
jstack [-m] [-l] <executable> <core>
jstack [-m] [-l] [server_id@]<remote server IP or hostname>
jstack参数如下:
option | 参数详情 |
-F | 当使用jstack 无响应时,强制输出线程堆栈。 |
-m | 同时输出java堆栈和c/c++堆栈信息(混合模式) |
-l | 除了输出堆栈信息外,还显示关于锁的附加信息 |
例如我们使用jstack查看上面的死循环代码定位死循环位置:
五、 jmap
jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。
jmap [option] <pid>
jmap [option] <executable <core>
jmap [option] [server_id@]<remote server IP or hostname>
jmap参数如下:
option | 参数详情 |
-heap | 打印堆的摘要信息 |
-histo[:live] | 打印堆中的java对象统计信息 |
-clstats | 打印类加载器统计信息 |
-finalizerinfo | 打印在f-queue中等待执行finalizer方法的对象 |
-dump:< dump-options > | 生成java堆的dump文件 |
例如我们查看堆的信息,只截图了部分,后面还有每个区的大小、使用情况、剩余情况信息:
六、 jhat
jhat也是jdk内置的工具之一。主要是用来分析dump的命令,jhat内置了应用服务器,可以通过网页查看dump文件分析结果。
jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file>
jhat参数如下:
option | 参数详情 |
-stack false | 关闭对象分配调用堆栈的跟踪 |
-refs false | 关闭对象引用的跟踪 |
-port | HTTP服务器端口,默认是7000 -debug : debug级别 |
-version | 分析报告版本 |
例如我们使用jmap -dump:live,file=f://dupm.bin 25736生成示例代码的dump,然后使用jhat分析
打开7000端口号: