
粉丝提问:
JDK 自带有哪些性能分析工具?如何使用 jstat、jmap 和 jvisualvm 检测 Java 应用的性能瓶颈并进行优化?
本文将详细解析 JDK 自带的性能分析工具,结合实际案例展示如何利用 jstat、jmap 和 jvisualvm 分析内存、线程和 GC 性能问题,并提出优化策略。
jstat 是 JDK 自带的命令行工具,用于实时监控 JVM 的垃圾回收(GC)、内存使用和类加载等性能数据。
jps输出示例:
12345 MainClass
67890 Jps12345 是目标应用的进程 ID。
jstat -gc <pid> <interval> <count><pid>:目标 JVM 进程 ID。<interval>:刷新间隔(毫秒)。<count>:刷新次数。jstat -gc 12345 1000 5输出示例:
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC FGC
1024.0 1024.0 512.0 0.0 8192.0 1024.0 16384.0 8192.0 5120.0 1024.0 640.0 128.0 10 2S0C/S0U:Survivor 0 区的容量与使用量。EC/EU:Eden 区的容量与使用量。YGC:年轻代 GC 的次数。FGC:Full GC 的次数。如果年轻代使用率高且 GC 频繁,可增加年轻代容量:
-Xmn<size>jmap 是用于分析 JVM 内存分布的工具,可以生成堆快照(Heap Dump)和查看对象分布。
jmap -heap <pid>输出示例:
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2.0GB)
NewSize = 5242880 (5.0MB)
OldSize = 139591680 (133.0MB)jmap -dump:format=b,file=<filename> <pid>jmap -dump:format=b,file=heap_dump.hprof 12345生成的 heap_dump.hprof 文件可用于后续分析。
jmap -histo <pid>输出示例:
num #instances #bytes class name
----------------------------------------------
1: 10240 16384000 [Ljava.lang.Object;
2: 5120 6553600 java.lang.String对于占用过多的对象,检查其生命周期,必要时使用 WeakReference 减少引用强度。
如果堆内存不足,调整最大堆内存:
-Xmx<size>jvisualvm 是一个图形化监控工具,可用于分析线程、内存、垃圾回收等 JVM 性能指标。
在命令行输入以下命令启动:
jvisualvm*.hprof),查看对象引用关系。Sampler 或 Profiler,分析热点方法和资源消耗。jstat -gc <pid> 1000 5分析:如果 YGC 增长过快,增加年轻代容量(-Xmn 参数)。
jmap -dump:format=b,file=heap_dump.hprof <pid>将快照导入到 jvisualvm 或 Eclipse MAT 中,分析对象引用链。
Profiler,查找消耗 CPU 时间最多的方法。A:
jstat -gc 查看年轻代与老年代的内存使用情况。jmap -heap 查看堆内存配置。A:
jmap -dump 导出堆快照。A:
确保应用启用了 JMX:
-Dcom.sun.management.jmxremoteJDK 自带工具的核心作用:
优化建议: