1. jps:虚拟机进程状况工具方式
首先,我们来看 jps 这个工具,它可以列出当前正在运行的 Java 虚拟机进程,jps 可以显示虚拟机执行的主类以及进程的虚拟机 ID“JVMID”。jps 是我们使用频率最高的工具,其他工具都需要依赖 jps 查询到的 JVMID 来进行下一步操作。下面我们看一下 jps 的命令格式
我们来看一下 jps -l 这个例子,前一列是查询到的 pid,后一列是主类的全名。
下面的列表是 jps 一些选项的作用。
2. jstat:虚拟机统计信息监视工具
jstat提供了运行中的JVM实例的性能数据,包括类加载、内存、垃圾回收等统计信息。
其中 interval 是查询的间隔时间,count 是查询的次数。我们来看一下jstat -gc 16400 200 3
这个例子,代表每 200 毫秒执行一次 jstat -gc 命令,连续执行 3 次。
我们再来了解一下查询出的这几个参数的含义:
-
S0、S1:Survivor0、Survivor1 幸存者区
-
E:新生代区
-
O:老年区
-
YGC:MinorGC
-
YGCT:MinorGC 的耗时
-
FGC:FullGC
-
FGCT:FullGC 总耗时
-
GCT:GCTime,意思是 GC 总耗时
3. jinfo:Java 配置信息工具
它可以用来查看和调整 JVM 的配置参数。使用 jps 的
-v
选项可以查看 JVM 启动时显式指定的参数,而 jinfo 的-flag
选项可以帮助我们查看那些使用了默认值的参数。更强大的是,jinfo 甚至可以在运行时修改这些参数。jinfo 的命令格式如下:
我们再来看一下 jinfo -flag 的例子,查询 MaxHeapSize 参数的值:
4. jmap:Java 内存映像工具
jmap可以用来生成堆内存快照(heap dump),分析内存使用情况,查找内存泄漏。jmap 不仅可以获取 dump 文件,还可以查询堆空间的使用情况和垃圾收集器的信息。jmap 的命令格式如下:
1.内存快照
2.内存使用详情
看完上述 option 选项的作用,
4.1 jmap 生成一个 dump 文件的例子
jmap -dump:format=b,file=aaa.bin 16400
分析堆转储文件:
使用MAT(Memory Analyzer Tool)或其他堆分析工具打开aaa.bin文件,分析内存使用情况和潜在的内存泄漏。
https://blog.csdn.net/beiback/article/details/138200448
4.2 jmap -heap 堆详细信息
5. jhat:虚拟机堆转储快照分析工具
jmap 有一个搭档叫 jhat,jhat 可以分析 jmap 生成的堆转储快照。jhat 生成的 dump 文件结果报告可以直接在浏览器中打开。不过 jhat 的分析功能相对来说比较简单,因此我们通常不会直接使用 jhat 来分析 dump 文件,此外要注意分析工作是一个耗时耗力的过程,所以不要在生产环境服务器上分析 dump 文件。后续我们会介绍更专业的分析工具,可以实现比 jhat 更专业的分析功能。
我们先来看一下使用 jhat 分析 dump 文件的例子:
根据提示在浏览器中输入 http://localhost:7000 就可以看到分析结果。
通过上述例子,我们可以看到分析结果以包为单位来分组显示,每个包都可以点进去看到更详细的分析,从而看到各种对象的空间占比,排查问题还是很方便的。你也可以自己尝试一下
6. jstack:java 堆栈跟踪工具
jstack是一个命令行工具,可以生成Java线程的快照,用于分析线程的状态和死锁问题。
jstack 用于生成虚拟机当前时刻的线程快照,也就是“线程 dump”文件。线程快照的意思就是线程当前的堆栈信息,生成线程快照的主要目的通常是为了定位线程阻塞的原因,如死循环、死锁、IO 资源问题等。如果发生线程阻塞,我们可以使用 jstack 来查看线程堆栈,就可以清晰地看到这些线程在后台执行什么任务、wait 什么 IO 资源。
我们来看一下 jstack 的命令格式:
我们使用 jstack -l 16400 查看线程堆栈。
https://codeup.aliyun.com/62858d45487c500c27f5aab5/210/mianshi-root/blob/master/JVM/src/main/java/com/example/jvm/VisualVMDemo.java
下面的列表是 jstack 具体选项的作用,你可以自己在服务上敲一下命令试试。
总结
JVM 自带的一系列常用工具,每个工具都有其独特的功能和用途。在遇到线上问题时,我们可以先使用 jps 查询进程的虚拟机 ID,如果是线程问题可以使用 jstack,如果是内存问题可以使用 jmap 和 jhat,而 jstat 和 jinfo 则可以帮助我们在问题发生前监控内存的使用情况和配置信息。当然,这些工具的基本使用方法还有很多细节,需要通过实践来完全掌握。