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 生成的堆转储快照
这个比较重要,生成的快照有助于排查问题,使用方法及效果如下图所示:
jstack
(Stack Trace for Java) 命令用于生成虚拟机当前时刻的线程快照。 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合, 生成线程快照的主要目的是定位线程出现长时间停顿的原因, 如线程间死锁、 死循环、 请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
使用效果如下图,可以定位到死锁。
命令工具总结
1) 生产服务器推荐开启
-XX:-HeapDumpOnOutOfMemoryError 默认关闭, 建议开启, 在 java.lang.OutOfMemoryError 异常出现时, 输出一个 dump 文件, 记录当时的堆内存快照。
-XX:HeapDumpPath=./java_pid<pid>.hprof 用来设置堆内存快照的存储文件路径, 默认是 java 进程启动位置。
2) 调优之前开启、 调优之后关闭
-XX:+PrintGC
调试跟踪之 打印简单的 GC 信息参数:
-XX:+PrintGCDetails, +XX:+PrintGCTimeStamps
打印详细的 GC 信息
-Xlogger:logpath
设置 gc 的日志路, 如: -Xlogger:log/gc.log, 将 gc.log 的路径设置到当前目录的 log 目录下.
应用场景: 将 gc 的日志独立写入日志文件, 将 GC 日志与系统业务日志进行了分离, 方便开发人员进行追踪分析。
3) 考虑使用
-XX:+PrintHeapAtGC, 打印推信息
参数设置: -XX: +PrintHeapAtGC
应用场景: 获取 Heap 在每次垃圾回收前后的使用状况
-XX:+TraceClassLoading
参数方法: -XX:+TraceClassLoading
应用场景: 在系统控制台信息中看到 class 加载的过程和具体的 class 信息, 可用以分析类的加载顺序以及是否可进行精简操作。
-XX:+DisableExplicitGC 禁止在运行期显式地调用 System.gc()