Java的命令行工具基本都知道在bin目录下有java.exe
、javac.exe
这两个,但是在JDK中还内置了其他的有用的性能监控、故障处理、查看JVM的一些工具,可以直观的看到JVM中数据和JVM参数等
工具总结
名称 | 主要作用 |
---|---|
jps | 显示当前系统的所有的JVM进程 |
jstat | 查看当前内存使用占比和方法区的类加载数量 |
jinfo | 显示JVM的配置信息,可以直接看到JVM的各项设置的参数 |
jmap | 查看JVM的堆内存的信息、堆转储快照 |
jhat | 用于分析heapdump文件,可以在浏览器中查看分析的结果 |
jstack | 显示JVM中栈的内存快照信息 |
jps
查看指定hostid的JVM进程信息,如果不指定hostid,那么就是当前系统
-
命令格式
jps [options] [hostid]
可以查看指定的hostid的虚拟机进程pid
-
执行
jps
可以看到启动的Java项目的进程可以显示到,并且可以看到该进程的PID
-
参数
jps -v
可以查看JVM启动时的参数jps -l
可以查看主类的全名jps -m
输出虚拟机启动时传递给主类main()函数的参数
jstat
查看当前虚拟机的统计信息
-
命令格式
jstat [option] pid [intervals[s/ns]] [count]
- option表示命令的可选参数,可以查看不同的信息
- pid 表示进程号
- intervals 表示间隔时间
- count 表示一共查询多少次
-
常用参数
option 作用 -class 查看当前方法区的类的数量和占用的内存空间 -gc 监视JVM中堆内存,主要有Eden、Survivor from、Survivor to、老年代、永久代等内存状态、GC的次数和占用的时间 -gccause 和-gc基本相同,不过会输出导致上一次GC的原因 -gcutil 和-gc基本相同,但是显示的信息表示为百分比,信息较为简洁 -gcnew 监视新生代的GC状况 -gcold 监视老年代的GC状况 -compiler 输出JIT编译器编译过的方法、耗时等信息 -printcompilation 输出已经被JIT编译过的方法 -
查询当前堆内存、GC情况
先通过jps或者top命令找到对应的pid
-
jstat -gc 8596
S0C:表示Survivor0区域的内存大小
S1C:表示Survivor1区域的内存大小
S0U:表示Survivor0区域已经使用的内存大小
S1U:表示Survivor1区域已经使用的内存大小
EC:Eden区域的内存大小
EU:Eden区域已经使用的内存大小
OC:老年代的内存大小
OU:老年代已经使用的内存大小
MC:方法区的内存大小
MU:方法区已使用的内存
YGC:Minor GC已经发生的次数
YGCT:Minor GC总共使用的时间
FGC:Full GC发生的次数
FGCT:Full GC总共使用的时间
GCT:总的GC占用时间
-
jinfo
实时的查看JVM的各项参数
-
命令格式
jinfo [option] pid
可以通过jps -v 查看到虚拟机启动的参数列表,如果想直接查看某个指定的参数的数据,那么可以通过jinfo查看
-
查看JVM配置参数
jinfo -flags pid
jinfo pid
可以查看到全面的系统信息和JVM信息
jmap
用于生成堆转储快照或者查看当前堆内存信息
-
命令格式
jmap [option] pid
-
查看JVM进程的堆内存信息
jmap -heap pid
-
统计当前堆内存中类数量、占用内存信息
jmap histo pid
-
生成堆内存快照
jmap -dump:format=b,file=app.dump 14236
会在当前的目录下生成app.dump文件,将当前的堆内存快照保存到文件中,可以使用jvisualvm、MAT等工具进行分析
jmap -dump:format=b,file=app.hprof 14236
也可以生成堆转储快照,不同的是hprof
文件可以通过jprofile来进行分析
jhat
虚拟机提供的堆转储快照分析工具
-
命令格式
jhat app.dump
-
可以展示dump文件的分析内容,会提供一个网页,在指定的端口可以打开,不过分析工具可以选择更加直观和完善的
visualvm
或者MAT
等
jstack
查看JVM中的栈内存空间信息、生成线程快照等
-
命令格式
jstack [option] pid
-
查看当前的线程快照信息
jstack -l pid
-l
表示除堆栈外,将锁的信息也显示
会有大量的堆栈信息展示在控制台
jstack -l pid >> thread.dump
将内容输出到文件中,然后根据线程的十六进制信息查找对应的堆栈信息
-
查找指定线程的堆栈信息(推荐)
- 使用
top
命令查看占用CPU最高的进程(按大写P对cpu使用排序) - 使用
ps -ef
或者jps -l
查看该进程的pid - 定位到具体的线程,使用
top -Hp pid
或者ps -mp pid -o THREAD,tid,time
,查看占用cpu或者内存过高的线程id - 将线程id转换为对应的16进制
printf "%x\n" 线程id
- 使用
jstack -l 进程Id|grep 线程id(小写英文) -A60
查看堆栈信息
- 使用
JDK可视化工具
-
Jconsole
在Jconsole中可以查看远程或者当前机器的内存、线程、类等信息
在控制台中直接使用
jconsole
命令就可以打开,该工具位于jdk/bin
-
jvisualvm
JDK自带的分析堆转储快照的可视化工具,可以对堆转储的快照进行分析,确定线程状态、内存占用实例、JVM参数、系统属性等信息
在控制台中使用
jvisualvm
会自动打开,该工具位于jdk/bin
-
visualvm
最强大的监视和故障处理工具,和Jvisualvm类似,不过在某些功能和插件上比jvisualvm更强大,使用方式一致,不过需要单独下载
visualvm