JVM调优

性能监测的命令行工具

操作系统层面:top、vmstat、iostat、netstat 等命令,可以监控系统整体的资源使用情况,比如说内存、CPU、IO 使用情况、网络使用情况。

JDK 自带的命令行工具层面,jps、jstat、jinfo、jmap、jhat、jstack、jcmd 等,可以查看 JVM 运行时信息、内存使用情况、堆栈信息等。

jmap 使用

使用 jmap -heap <pid> 查看堆内存摘要,包括新生代、老年代、元空间等。

使用 jmap -histo <pid> 查看对象分布。

生成堆转储文件:jmap -dump:format=b file=<path><pid>

可视化的性能监控工具

JConsole:JDK 自带的监控工具,可以用来监视 Java 应用程序的运行状态,包括内存使用、线程状态、类加载、GC 等。

VisualVM:一个基于 NetBeans 的可视化工具,在很长一段时间内,VisualVM 都是 Oracle 官方主推的故障处理工具。集成了多个 JDK 命令行工
具的功能,非常友好。

Java Mission Control:JMC 最初是 JRockit VM 中的诊断工具,但在Oracle JDK7 Update 40 以后,就绑定到了 HotSpot VM 中。不过后来又被
Oracle 开源出来作为了一个单独的产品。

arthas:阿里巴巴开源的 Java 诊断工具,主要用于线上的应用诊断;支持在不停机的情况下进行诊断;可以提供包括JVM信息查看、监控、Trace 命令、反编译等功能。

CPU 高占用排查?

首先,使用 top 命令查看 CPU 占用情况,找到占用 CPU 较高的进程 ID。

接着,使用 jstack 命令查看对应进程的线程堆栈信息。
jstack -l <pid> > thread-dump.txt

这个命令会将所有线程的堆栈信息输出到 thread-dump.txt 文件中。

然后再使用 top 命令查看进程中线程的占用情况,找到占用 CPU 较高的线程 ID。
top -H -p <pid>

接着在 jstack 的输出中搜索这个十六进制的线程 ID,找到对应的堆栈信息。

内存飙高问题排查?

内存飚高一般是因为创建了大量的 Java 对象导致的,如果持续飙高则说明垃圾回收跟不上对象创建的速度,或者内存泄漏导致对象无法回收。

第一,先观察垃圾回收的情况,可以通过 jstat -gc PID 1000 查看GC 次数和时间。
或者使用 jmap -histo PID | head -20 查看堆内存占用空间最大的前 20 个对象类型。

第二步,通过 jmap 命令 dump 出堆内存信息。

第三步,使用可视化工具分析 dump 文件,比如说 VisualVM,找到占用内存高的对象,再找到创建该对象的业务代码位置,从代码和业务场景中定
位具体问题。


JVM调优
http://bloomivy.github.io/2025/02/05/JVM调优/
作者
Bloom
发布于
2025年2月5日
许可协议