用于监视虚拟机和故障处理的命令行工具主要有 jps、jstat、jinfo、jmap、jhat、jstack。
用来编译、运行应用程序的主要有java。
jps
JVM Process Status Tool 类似UNIX命令的ps命令,可以列出正在运行的虚拟机进程及虚拟机执行主类名称。
常用选项如下表
选项 | 作用 |
---|---|
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名,如果进程执行的是jar包,输出jar路径 |
-v | 输出虚拟机进程启动时的jvm参数 |
如果忘记选项作用,可以使用jps -help输出提示
jinfo
Configuration Info for Java 的作用是实时地查看和调整虚拟机各项参数
jstat
JVM statistics Monitoring Tool 虚拟机统计信息监控工具。主要用于显示虚拟机进程中的类装载、内存、垃圾回收、JIT编译等运行数据,它将是运行期定位虚拟机性能问题的首选工具。
最经典的使用方式示例如下:
jstat -gc 2764 1000 20 #每1000ms查询一次进程2764的垃圾回收情况
常用选项如下表
选项 | 作用 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载耗用的时间 |
-gc | 监视java堆状况,包括eden区,两个survivor区,老年代,永久代等的容量、已用空间、GC时间合计等信息 |
-gcutil | 监视内容与-gc基本相同,但更关注已使用空间占总空间的百分比 |
jmap
Memory Map for Java 命令用于生成堆转储快照。主要用于查询Java堆详细信息,如空间使用率、当前用的是哪种收集器。
示例结果
jmap -heap 4631
---------------------
Attaching to process ID 4631, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.92-b14
using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC
Heap Configuration:
MinHeapFreeRatio = 40
# 默认情况下,vm会增加/减少heap大小以维持free space在整个vm中占的比例,
# 这个比例由MinHeapFreeRatio和MaxHeapFreeRatio指定
MaxHeapFreeRatio = 70
MaxHeapSize = 10737418240 (10240.0MB) # 最大堆内存, -Xmx
NewSize = 2684354560 (2560.0MB) # 新生代初始分配大小
MaxNewSize = 2684354560 (2560.0MB) # 新生代最大分配大小
OldSize = 8053063680 (7680.0MB) # 老年代分配大小
NewRatio = 3 # 新生代:老年代=1:3
SurvivorRatio = 4 # Eden区:Survior区=4:1
MetaspaceSize = 21807104 (20.796875MB) #元空间初始分配大小
CompressedClassSpaceSize = 1073741824 (1024.0MB)
#CompressedClassSpaceSize的调优只有当-XX:+UseCompressedClassPointers开启了才有效
MaxMetaspaceSize = 17592186044415 MB #元空间最大分配大小
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 2237005824 (2133.375MB) # 新生代 * (4+1)/(4+1+1)
used = 257821080 (245.8773422241211MB)
free = 1979184744 (1887.497657775879MB)
11.525275313722204% used
Eden Space:
capacity = 1789657088 (1706.75MB) # 新生代 *4/(4+1+1)
used = 210176568 (200.43999481201172MB)
free = 1579480520 (1506.3100051879883MB)
11.74395751059099% used
From Space:
capacity = 447348736 (426.625MB) # 新生代 *1/(4+1+1)
used = 47644512 (45.437347412109375MB)
free = 399704224 (381.1876525878906MB)
10.65041837963302% used
To Space:
capacity = 447348736 (426.625MB) # 新生代 *1/(4+1+1)
used = 0 (0.0MB)
free = 447348736 (426.625MB)
0.0% used
concurrent mark-sweep generation:
capacity = 8053063680 (7680.0MB) # 等于老年代
used = 2144954408 (2045.5879287719727MB)
free = 5908109272 (5634.412071228027MB)
26.635259489218395% used
23000 interned Strings occupying 2268448 bytes.
另外一个使用频率较高的命令是jmap -dump:format=b,file=xxx.hprof
这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。
jhat
JVM Heap Analysis Tool 命令一般与jmap搭配使用,来分析jmap生成的堆转储快照。默认情况下,执行jmap xxx.hprof命令后,可以通过ip:7000进行浏览器访问查看分析结果。
jstack
Stack Trace for Java 命令用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待都是导致线程长时间停顿的常见原因。
命令格式 jstack [ option ] vmid
主要选项
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时,强制输出线程堆栈 |
-l | 除堆栈外,显示关于锁的附加信息 |
-m | 如果调用到本地方法的话,可以显示C/C++的堆栈 |
一点小提示,在JDK1.5中,Thread类增加了一个getAllStackTraces()方法用于获取虚拟机中所有线程的StackTraceElement对象。实际项目中,可以调用这个方法做个管理员页面,可以随时使用浏览器查看线程堆栈情况。
java
java -jar myAppJar.jar -cp picocontainer-2.x.jar timeout=100 spellingWebServiceURL=http://ws.com/someService.wsdl
-cp 表示 classpath 依赖的二方包路径