JVM命令行工具使用说明小记
jps
列出当前机器上正在运行的虚拟机进程, JPS 从操作系统的临时目录上去找(所以有一些信息可能显示不全)
- -q :仅仅显示进程,
- -m:输出主函数传入的参数. 下的 hello 就是在执行程序时从命令行输入的参数
- -l: 输出应用程序主类完整 package 名称或 jar 完整名称.
- -v: 列出 jvm 参数, -Xms20m -Xmx50m 是启动程序指定的 jvm 参数
jstat
用于监视虚拟机各种运行状态信息的命令行工具。 它可以显示本地或者远程虚拟机进程中的类装载、 内存、 垃圾收集、 JIT 编译等运行数据, 没有 GUI图形界面, 只提供了纯文本控制台环境的服务器上, 它将是运行期定位虚拟机性能问题的首选工具。
常用参数如下:
- -class (类加载器)
- -compiler (JIT)
- -gc (GC 堆状态)
- -gccapacity (各区大小)
- -gccause (最近一次 GC 统计和原因)
- -gcnew (新区统计)
- -gcnewcapacity (新区大小)
- -gcold (老区统计)
- -gcoldcapacity (老区大小)
- -gcpermcapacity (永久区大小)
- -gcutil (GC 统计汇总)
- -printcompilation (HotSpot 编译统计)
假设需要每 1000 毫秒查询一次进程 12628 垃圾收集状况,一共查询 10 次。命令如下图所示。
而这个输出结果的各个参数描述,如下;
- S0C: 第一个幸存区(From 区) 的大小
- S1C: 第二个幸存区(To 区) 的大小
- S0U: 第一个幸存区的使用大小
- S1U: 第二个幸存区的使用大小
- EC: 伊甸园(Eden) 区的大小
- EU: 伊甸园(Eden) 区的使用大小
- OC: 老年代大小
- OU: 老年代使用大小
- MC: 方法区大小
- MU: 方法区使用大小
- CCSC:压缩类空间大小
- CCSU:压缩类空间使用大小
- YGC: 年轻代垃圾回收次数
- YGCT: 年轻代垃圾回收消耗时间
- FGC: 老年代垃圾回收次数
- FGCT: 老年代垃圾回收消耗时间
- GCT: 垃圾回收消耗总时间
jinfo
这个命令主要是给牌运行期间的jvm设置一些JVM参数,以及查看JVM的参数
- jinfo –sysprops 可以查看由 System.getProperties()取得的参数
- jinfo –flag 未被显式指定的参数的系统默认值
- jinfo –flags( 注意 s) 显示虚拟机的参数
在 windows 上,我们可以通过以下 java -XX:+PrintFlagsFinal –version 查询所有-XX 的参数,如下图所示
那么,应该怎么修改参数呢?
命令: jinfo –flag -/+[参数] 进程号pid , 其中参数就是上图命令输出中结果中的第二列中的参数,+表示开启参数,-表示关闭参数
一般使用PrintGCDetails参数,打印详细日志。
总结: 通过 jinfo 命令, 我可以在生产上临时打开一下 GC 日志或者进行一些数据的配置。 (不需要重启应用条件下) , 也是我们去排查问题的一个关键命令。
jmap
用于生成堆转储快照(一般称为 heapdump 或 dump 文件) 。 jmap 的作用并不仅仅是为了获取 dump 文件, 它还可以查询 finalize 执行队列、 Java 堆和永久代的详细信息, 如空间使用率、 当前用的是哪种收集器等。 和 jinfo 命令一样, jmap 有不少功能在 Windows 平台下都是受限的, 除了生成 dump 文件的 -dump 选项和用于查看每个类的实例、 空间占用统计的-histo 选项在所有操作系统都提供之外, 其余选项都只能在 Linux/Solaris 下使用。
1)打印 heap 的概要信息,如图
2)打印每个 class 的实例数目,内存占用,类全名信息,如下图
上图是打印JVM中所有的实例内存占用,如果只想看存活的实例的内存占用的情况,则可以使用如下图的命令
还可以对输出结果作条数限制,使用命令如: jmap –histo 进程号 | head -20,这样只会显示排名前 20 的数据
3)dump 生成的堆转储快照
这个比较重要,生成的快照有助于排查问题,使用方法及效果如下图所示: