熟悉 java 的人都知道 jdk 的 bin 目录中有很多小工具, 其中就包括用于监视虚拟机和故障处理的工具, 今天就来仔细了解下各个工具的用法
jps
JVM Process Status Tool, 用于显示指定系统的内所有的 Hotapot 的虚拟机进程
1. 用法
jps [options] [hostid]
2. 参数列表
q: 只输出 LVMID, 省略主类的名称
m: 输出虚拟机进程启动时传递给主类 main()函数的参数
l: 输出主类的全名若进程执行的是 jar 包, 则输出 jar 路径
v: 输出虚拟机进程启动时 JVM 参数
3. 实际举例:
1. jps -q : 只输出 LVMID, 省略主类的名称
2. jps -m: 输出虚拟机进程启动时传递给主类 main()函数的参数
3.jps -l: 输出主类的全名若进程执行的是 jar 包, 则输出 jar 路径
4.jps -v: 输出虚拟机进程启动时 JVM 参数
5. 参数 vl 一起: 这样我们就能很方便的查看各个程序设定的参数了
jstat
Java Statisstic Monitoring Tool : 一个极强的监视 VM 内存工具可以用来监视 VM 内存内的各种堆和非堆的大小及其内存使用量
1. 用法
jstat [Options] vmid [interval] [count]
Options, 选项, 我们一般使用 -gcutil 查看 gc 情况
vmid,VM 的进程号, 即当前运行的 java 进程号
interval, 间隔时间, 单位为秒或者毫秒
count, 打印次数, 如果缺省则打印无数次
2. 参数列表
jstat -class pid: 显示加载 class 的数量, 及所占空间等信息
jstat -compiler pid: 显示 VM 实时编译的数量等信息
jstat -gc pid: 可以显示 gc 的信息, 查看 gc 的次数, 及时间其中最后五项, 分别是 young gc 的次数, young gc 的时间, full gc 的次数, full gc 的时间, gc 的总时间
jstat -gccapacity: 可以显示, VM 内存中三代 (young,old,perm) 对象的使用和占用大小, 如: PGCMN 显示的是最小 perm 的内存使用量, PGCMX 显示的是 perm 的内存最大使用量, PGC 是当前新生成的 perm 内存占用量, PC 是但前 perm 内存占用量其他的可以根据这个类推, OC 是 old 内纯的占用量
jstat -gcnew pid:new 对象的信息
jstat -gcnewcapacity pid:new 对象的信息及其占用量
jstat -gcold pid:old 对象的信息
jstat -gcoldcapacity pid:old 对象的信息及其占用量
jstat -gcpermcapacity pid: perm 对象的信息及其占用量
jstat -util pid: 统计 gc 信息统计
jstat -printcompilation pid: 当前 VM 执行的信息
除了以上一个参数外, 还可以同时加上 两个数字, 如: jstat -printcompilation 3024 250 6 是每 250 毫秒打印一次, 一共打印 6 次, 还可以加上 - h3 每三行显示一下标题
3. 实际举例
1. -gc: 监视 java 堆状况
S0C: 年轻代中第一个 survivor(幸存区)的容量 (字节)
S1C: 年轻代中第二个 survivor(幸存区)的容量 (字节)
S0U: 年轻代中第一个 survivor(幸存区)目前已使用空间 (字节)
S1U: 年轻代中第二个 survivor(幸存区)目前已使用空间 (字节)
EC: 年轻代中 Eden 的容量 (字节)
EU: 年轻代中 Eden 目前已使用空间 (字节)
OC:Old 代的容量 (字节)
OU:Old 代目前已使用空间 (字节)
PC:Perm(持久代)的容量 (字节)
PU:Perm(持久代)目前已使用空间 (字节)
YGC: 从应用程序启动到采样时年轻代中 gc 次数
2.-gcutil: 与 - gc 基本相同, 但输出的是已使用空间占总空间的大小
jinfo
Configuration Info for Java: 实时的查看和调整虚拟机各项参数
1. 用法:
jinfo [option] <pid>
2. 参数:
jinfo 主要就是 flag 参数了, 上图已经解释的很清楚了, 这里直接做演示好了
3. 实际举例
1. 获取进程 30018 的 SurvivorRatio 信息
2. 获取进程 30018 所有的 jvm 信息
这个命令比 jps -v 更加详细
jmap
打印出某个 java 进程 (使用 pid) 内存内的, 所有对象的情况(如: 产生那些对象, 及其数量)
可以输出所有内存中对象的工具, 甚至可以将 VM 中的 heap, 以二进制输出成
文本使用方法 jmap -histo pid 如果连用 SHELL jmap -histo pid>a.log
可以将其保存到文本中去, 在一段时间后, 使用文本对比工具, 可以对比出 GC
回收了哪些对象 jmap -dump:format=b,file=outfile 3024 可以将 3024 进
程的内存 heap 输出出来到 outfile 文件里, 再配合 MAT(内存分析工具 (Memory Analysis Tool) 或与 jhat (Java Heap Analysis Tool)一起使用,
能够以图像的形式直观的展示当前内存是否有问题
1. 用法
jmap [option] <pid>
2. 参数
- 1)options:
- executable Java executable from which the core dump was produced.
- (可能是产生 core dump 的 java 可执行程序)
core 将被打印信息的 core dump 文件
remote-hostname-or-IP 远程 debug 服务的主机名或 ip
server-id 唯一 id, 假如一台主机上多个远程 debug 服务
2)基本参数:
-dump:[live,]format=b,file=<filename> 使用 hprof 二进制形式, 输出 jvm 的 heap 内容到文件 =. live 子选项是可选的, 假如指定 live 选项, 那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印 heap 的概要信息, GC 使用的算法, heap 的配置及 wise heap 的使用情况.
-histo[:live] 打印每个 class 的实例数目, 内存占用, 类全名信息. VM 的内部类名字开头会加上前缀 *. 如果 live 子参数加上后, 只统计活的对象数量.
-permstat 打印 classload 和 jvm heap 长久层的信息. 包含每个 classloader 的名字, 活泼性, 地址, 父 classloader 和加载的 class 数量. 另外, 内部 String 的数量和占用内存数也会打印出来.
-F 强迫. 在 pid 没有相应的时候使用 - dump 或者 - histo 参数. 在这个模式下, live 子参数无效.
-h | -help 打印辅助信息
-J 传递参数给 jmap 启动的 jvm.
pid 需要被打印配相信息的 java 进程 id
3. 实际举例
1.jmap -heap 打印 heap 的概要信息, GC 使用的算法, heap 的配置及 wise heap 的使用情况.
这个命令非常直观的显示了 JVM 各个区域的生存情况, 线上还款内存出现异常可以先用这个命令做一个大致的了解
2.jmap -histo:
这个命令会把所有的类都打出来, 并按占用内存的大小进行排序
3.jmap -dump:
解释下 jmap -F -dump:format=b,file=payment.bin 30018: 使用 hprof 二进制形式, 输出进程为 30018 的 jvm 的 heap 内容到文件 payment.bin
jhat
是用来分析 java 堆的命令, 可以将堆中的对象以 html 的形式显示出来, 包括对象的数量, 大小等等, 并支持对象查询语言
我们现在来分析下上文产生的 payment.bin
用浏览器访问 http://localhost:7000/, 会发现所有的类按包名进行分类, 我们可以访问底部的这个标签, 看到的内容和 jmap -histo: 是一样的
参考
- http://www.cnblogs.com/ggjucheng/archive/2013/04/16/3024986.html
- http://blog.csdn.net/zlzlei/article/details/46471627
来源: http://www.bubuko.com/infodetail-2520669.html