16. JVM调优工具
1. JVM介绍和运行流程
2. JVM程序计数器
3. JAVA堆和JVM内存结构
4. 虚拟机栈
5. JVM的方法区
6. JVM直接内存
7. JVM类加载器与双亲委派模型
8. JVM类装载的执行过程
9. JVM垃圾回收
10. 垃圾回收算法
11. JVM中的分代回收
12. JVM的垃圾回收器
13. G1 垃圾回收器
14. 垃圾回收的引用区别
15. JVM调优的参数设置
16. JVM调优工具
1. 命令工具
- jps 进程状态信息
- jstack 查看java进程内线程的堆栈信息
- jmap 查看堆转信息
- jhat 堆转储快照分析工具
- jstat JVM统计监测工具
1. jps
(JVM Process Status Tool)
查看进程状态信息
作用:
- 列出当前系统中所有的Java进程(PID和主类名)。
常用选项:
-l
:显示完整主类名(包含包路径)-v
:显示JVM启动参数
示例:
public class ToolDemo {public static void main(string[] args){new Thread(()->{while (true){}},name:"t1").start();new Thread(()->{while (true){}},name: "t2").start();new Thread(()->{while(true){}},name:"t3").start();}
}
运行后再控制台查看
2. jstack
(Stack Trace Tool)
查看java进程内线程的堆栈信息
作用:
- 生成Java进程的线程快照(Thread Dump),用于分析死锁、线程阻塞、CPU飙高等问题。
常用选项:
-l
:显示锁的附加信息(如持有锁的线程)-F
:强制生成线程快照(适用于进程无响应时)
示例:
jstack [option] <pid>
public class ToolDemo {public static void main(string[] args){new Thread(()->{while (true){}},name:"t1").start();new Thread(()->{while (true){}},name: "t2").start();new Thread(()->{while(true){}},name:"t3").start();}
}
运行后再控制台查看
控制台结果会有很多信息 ,下面是我们自己运行的三个线程
3. jmap
(Memory Map Tool)
用于生成堆转内存快照、内存使用情况
作用:
- 生成堆内存快照(Heap Dump)或查看堆内存对象分布。
常用选项:
-heap
:显示堆内存配置和使用情况(Eden/Survivor/Old区等)-histo
:显示堆中对象的统计直方图(按类/实例数排序)-dump:format=b,file=<filename>
:生成二进制Heap Dump文件
示例:
jmap -heap pid 显示Java堆的信息
jmap -dump:format=b,file=heap.hprof pid
- format=b表示以hprof二进制格式转储Java堆的内存。
- file=<filename>用于指定快照dump文件的文件名。
下面是一个 jmap -heap pid 指令运行后打印的模版
Attaching to process ID 56473, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.321-b07using thread-local object allocation.
Parallel GC with 8 thread(s) # 使用的GC算法Heap Configuration: # 堆内存配置MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize = 4294967296 (4096.0MB) # 最大堆内存NewSize = 89128960 (85.0MB) # 新生代初始大小MaxNewSize = 1431306240 (1365.0MB) # 新生代最大大小OldSize = 179306496 (171.0MB) # 老年代大小NewRatio = 2 # 新生代:老年代比例SurvivorRatio = 8 # Eden:Survivor比例MetaspaceSize = 21807104 (20.796875MB) # 元空间初始大小CompressedClassSpaceSize = 1073741824 (1024.0MB)G1HeapRegionSize = 0 (0.0MB)Heap Usage: # 堆内存使用情况
PS Young Generation # 新生代(Parallel Scavenge)
Eden Space: # Eden区capacity = 67108864 (64.0MB)used = 16777216 (16.0MB)free = 50331648 (48.0MB)25.0% used
From Space: # Survivor区(From)capacity = 1048576 (1.0MB)used = 0 (0.0MB)free = 1048576 (1.0MB)0.0% used
To Space: # Survivor区(To)capacity = 1048576 (1.0MB)used = 0 (0.0MB)free = 1048576 (1.0MB)0.0% used
PS Old Generation # 老年代(Parallel Old)capacity = 179306496 (171.0MB)used = 0 (0.0MB)free = 179306496 (171.0MB)0.0% used3189 interned Strings occupying 259768 bytes.
注意:
- 生成Heap Dump可能导致进程暂停,谨慎在生产环境使用!
4. jhat
(JVM Heap Analysis Tool)
-
作用:分析Heap Dump文件(内置简易HTTP服务器,通过浏览器查看结果)。
-
缺点:功能简单,性能较差,推荐用Eclipse MAT替代。
-
访问
http://localhost:7000
查看分析结果。
5. jstat
(JVM Statistics Monitoring Tool)
是JVM统计监测工具。可以用来显示垃圾回收信息、类加载信息、新生代统计信息等。
作用:
- 实时监控JVM内存、GC、类加载等统计信息。
常用选项:
-gcutil
:显示GC分代区域使用率(百分比)-gc
:显示各分代内存容量和GC次数/时间
示例:
- 总结垃圾回收统计
jstat -gcutil pid
- 第一行是 幸存者区、Edne 区、老年代区、元数据
- 第一行后面的是对应的 GC
- 第二行是分区所占的比例
- 垃圾回收统计
jstat -gc pid
输出关键字段:
YGC/YGCT
:Young GC次数/耗时FGC/FGCT
:Full GC次数/耗时OGC/OU
:Old区容量/使用量
2. 可视化工具
- jconsole 用于对jvm的内存,线程,类的监控
- VisualVM 能够监控线程,内存情况
2.1 JConsole
用于对jvm的内存,线程,类的监控,是一个基于jmx 的 GUI性能监控工具
打开方式:java 安装目录 bin目录下 直接启动jconsole.exe 就行
基本介绍
-
所属:JDK自带(位于
bin/jconsole.exe
或bin/jconsole
)。 -
功能定位:轻量级基础监控,适合快速查看JVM基础状态。
核心功能
功能模块 | 说明 |
---|---|
内存监控 | 实时显示堆(Heap/Non-Heap)、各代(Eden/Old/Survivor)内存使用曲线。 |
线程监控 | 查看线程数、状态(运行/阻塞/等待),支持检测死锁。 |
类加载 | 监控已加载/卸载的类数量。 |
MBean | 通过JMX查看/操作JVM和应用的MBean属性(如GC次数、线程池参数)。 |
连接方式 | 支持本地进程直接连接或远程JMX连接。 |
优缺点
-
优点:
-
无需安装,开箱即用。
-
低开销,适合生产环境基础监控。
-
-
缺点:
-
功能较基础,缺少高级分析(如内存泄漏分析)。
-
界面较老旧,交互体验一般。
-
启动命令
jconsole <pid> # 本地连接
jconsole hostname:port # 远程JMX连接
2.2 VisualVM
能够监控线程,内存情况,查看方法的CPU时间和内存中的对象,已被GC的对象,反向查看分配的堆栈
打开方式:java 安装目录 bin目录下 直接启动 ivisualvm.exe就行
基本介绍
-
所属:曾为JDK自带(JDK 9后需单独下载)。
-
功能定位:功能全面的JVM分析工具,支持插件扩展。
核心功能
功能模块 | 说明 |
---|---|
内存/CPU监控 | 实时堆内存、Metaspace、CPU使用率图表,支持手动执行GC。 |
线程分析 | 可视化线程状态、时间线,支持线程转储和死锁检测。 |
抽样器 | 可对CPU或内存进行抽样分析(定位热点方法/对象)。 |
Heap Dump | 生成和分析堆转储文件(查看大对象、类实例分布)。 |
插件扩展 | 支持安装插件(如Visual GC、BTrace),增强GC分析或动态追踪能力。 |
优缺点
-
优点:
-
功能全面,支持插件扩展(如Visual GC插件可直观展示各代内存变化)。
-
提供Heap Dump和线程快照分析,适合开发环境调试。
-
-
缺点:
-
对生产环境有一定开销(尤其是抽样分析时)。
-
需要手动安装,高版本JDK需单独下载。
-
启动命令
jvisualvm # 启动VisualVM(需在JDK bin目录下或配置环境变量)
2.3 对比总结
特性 | JConsole | VisualVM |
---|---|---|
内存监控 | 基础图表 | 详细图表 + Heap Dump分析 |
线程分析 | 基础状态/死锁检测 | 时间线可视化 + 线程快照 |
GC监控 | 仅通过MBean查看GC次数 | Visual GC插件展示各代内存回收细节 |
CPU分析 | 不支持 | 抽样器定位热点方法 |
插件系统 | 无 | 支持(如BTrace动态追踪) |
适用场景 | 生产环境快速检查 | 开发/测试环境深度分析 |
3. 问题总结
3.1 说一下 JVM 调优的工具?
命令工具
- jps 进程状态信息
- jstack 查看java进程内线程的堆栈信息
- jmap 查看堆转信息
- jhat 堆转储快照分析工具
- jstat JVM统计监测工具
可视化工具
- jconsole用于对jvm的内存,线程,类 的监控
- VisualVM能够监控线程,内存情况