JVM学习笔记(5) 第二部分 自动内存管理 第4章 虚拟机性能监控、故障处理工具

文章目录

  • 第4章:虚拟机性能监控、故障处理工具
    • [4.0 个人感悟](#4.0 个人感悟)
    • [4.1 概述](#4.1 概述)
    • [4.2 JDK命令行工具(基础但强大)](#4.2 JDK命令行工具(基础但强大))
      • [4.2.1 jps:虚拟机进程状况工具](#4.2.1 jps:虚拟机进程状况工具)
      • [4.2.2 jstat:虚拟机统计信息监视工具](#4.2.2 jstat:虚拟机统计信息监视工具)
      • [4.2.3 jinfo:配置信息工具](#4.2.3 jinfo:配置信息工具)
      • [4.2.4 jmap:内存映像工具(dump快照 堆信息)](#4.2.4 jmap:内存映像工具(dump快照 堆信息))
      • [4.2.5 jhat:堆转储快照分析工具(已过时)](#4.2.5 jhat:堆转储快照分析工具(已过时))
      • [4.2.6 jstack:堆栈跟踪工具](#4.2.6 jstack:堆栈跟踪工具)
    • [4.3 JDK可视化工具](#4.3 JDK可视化工具)
      • [4.3.1 JConsole(JDK自带)](#4.3.1 JConsole(JDK自带))
      • [4.3.2 VisualVM(多合一工具)](#4.3.2 VisualVM(多合一工具))
      • [4.3.3 其他工具(建议学会)](#4.3.3 其他工具(建议学会))

第4章:虚拟机性能监控、故障处理工具

4.0 个人感悟

  • 工具是知识的包装。不要本末倒置沉迷于工具使用,弄清原理会让思路更清晰
  • 与时俱进。一顿研究JHSDB,结果发现已经有更先进的上位替代工具了。得从书本中走出来,结合当前环境来学习
  • 工具的发展确实大大提升了生产小心,感谢为工具做出贡献的组织和个人

4.1 概述

工具的目的

解决定位问题时的困境(如内存泄漏、线程死锁、GC频繁等)

分类

  • 命令行工具
  • 可视化工具
    • JDK自带
    • 三方提供

4.2 JDK命令行工具(基础但强大)

总述

工具名称 作用简述
jps 列出正在运行的JVM进程(类似Linux的ps)
jstat 监视JVM统计信息,如GC、类加载、JIT编译
jinfo 查看或修改JVM配置参数
jmap 生成堆转储快照(heap dump),查询堆信息
jhat 分析heap dump(已被VisualVM等取代)
jstack 查看线程栈,检测死锁

4.2.1 jps:虚拟机进程状况工具

功能

查看虚拟机进程状况

语法
jps [option] [hostid]

常用选项

  • -l 输出完整主类名或jar路径
  • -v 输出JVM启动参数
  • -m 输出main方法的参数

示例

shell 复制代码
PS D:\code\com.dawn> jps -l
21332 jdk.jcmd/sun.tools.jps.Jps
12460 com.intellij.idea.Main

4.2.2 jstat:虚拟机统计信息监视工具

语法
jstat [option] vmid [interval] [count]

常用选项
-gc 查看GC情况(Eden、S0/S1、Old、Metaspace等容量与使用)
-gcutil 查看GC摘要(已使用占比)
-class 类加载信息
-compiler JIT编译信息

示例

每250ms输出一次,共10次

shell 复制代码
 D:\code\com.dawn> jstat -gc 12460 250 10 
   S0C         S1C         S0U         S1U          EC           EU           OC           OU          MC         MU       CCSC      CCSU     YGC     YGCT     FGC    FGCT     CGC    CGCT       GCT   
       0.0     10240.0         0.0      9561.3     159744.0       4096.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0       5120.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0       8192.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0      12288.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0      15360.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0      23552.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0      25600.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0      30720.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0      30720.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339
       0.0     10240.0         0.0      9561.3     159744.0      34816.0     310272.0     279352.0   361856.0   355646.0   49024.0   46439.7     36     0.163     1     0.079    24     0.097     0.339

4.2.3 jinfo:配置信息工具

功能

查看或动态修改JVM参数(某些参数可动态修改)

语法
jinfo [option] pid

常用命令
jinfo -flags <pid> 查看所有参数
jinfo -flag <name> <pid> 查看某个具体参数值
jinfo -flag [+|-]<name> <pid> 修改boolean参数

示例 :

查询PrintGCDetails是否开启 结果中 +表示true -表示false

shell 复制代码
PS D:\code\com.dawn> jinfo -flag PrintGCDetails 3244
-XX:-PrintGCDetail

4.2.4 jmap:内存映像工具(dump快照 堆信息)

功能

dump快照,堆信息跟踪

语法
jmap [option] vmid

常用命令

  • jmap -dump:live,format=b,file=heap.bin <pid> 生成dump(live表示只转存活对象)
  • jmap -histo <pid> 查看对象数量与大小统计
  • jmap -heap <pid> 查看堆内存配置与使用(某些JDK版本已废弃

示例

可以指定存储路径

shell 复制代码
PS D:\code\com.dawn> jmap -dump:live,format=b,file=D:\temp\heap_12460_live.hprof 12460      
Dumping heap to D:\temp\heap_12460_live.hprof ...
Heap dump file created [396580350 bytes in 0.322 secs]

注意:执行jmap时可能暂停进程(尤其是full gc前)

4.2.5 jhat:堆转储快照分析工具(已过时)

功能

堆转储快照分析工具

语法
jhat heap.bin,启动一个HTTP服务器供浏览器查看。

说明:JDK9后移除,可用VisualVM或MAT代替。

4.2.6 jstack:堆栈跟踪工具

功能

生成线程快照(thread dump),定位死锁、长时间停顿

常用命令

  • jstack <pid> 基本用法
  • jstack -l <pid> 显示锁信息(用于死锁分析)
  • jstack -F 强制输出(进程无响应时)

死锁检测

输出中会直接提示"Found one Java-level deadlock"。

4.3 JDK可视化工具

4.3.1 JConsole(JDK自带)

启动

windows下双击 jconsole.exe,启动图形界面

功能

  • 内存监控(Heap / Non-Heap / Metaspace)
  • 线程监控(线程数、线程状态、死锁检测)
  • 类加载监控
  • MBean管理(可调用方法,修改属性)

示例

连接到本地或远程JVM,实时观察内存曲线、GC活动

以64kb/50ms向堆填充数据

java 复制代码
/**  
* @Description JConsoleTest  
* @Author bigHao  
* @Date 2026/4/4  
*/public class JConsoleTestCase {  
    static class OOMObject {  
        public byte[] array = new byte[64 * 1024];  
    }  
 
    public static void fillHeap(int num) throws InterruptedException {  
        List<OOMObject> list = new ArrayList<OOMObject>();  
        for (int i = 0; i < num; i++) {  
            Thread.sleep(50);  
            list.add(new OOMObject());  
        }  
        System.gc();  
    }  
 
 
    public static void main(String[] args) throws InterruptedException {  
        fillHeap(1000);  
        System.out.println("done");  
    }  
}

JVM参数:

复制代码
-Xms100m -Xmx100m -XX:+UseSerialGC

概览:曲线统计概览

内存:可以看到堆内各个分区的使用情况

线程:可以看到线程情况,还有检查死锁功能

4.3.2 VisualVM(多合一工具)

启动

windows下双击 visualvm.exe,启动图形界面(JDK6~8自带,JDK9后需单独下载)

下载地址:https://visualvm.github.io/

核心功能

  • 监控CPU、内存、类、线程
  • 生成heap dump / thread dump
  • 插件扩展(如Visual GC查看GC详细过程)
  • 离线分析dump文件

插件推荐

  • Visual GC:图形化展示分代GC情况
  • Tracer:跟踪方法调用耗时
  • BTrace(需单独安装):动态跟踪应用

示例

因为v22没有中文版本,这里找个个汉化工具,有部分汉化,日常使用足够,有兴趣可以了解

https://github.com/zedoCN/VVM-Translator

安装完成后会自动获取本机java进程,这里查看IDEA进程:基本功能菜单类似jconsle

dump快照:

快照分析:

分析器功能:

BTrace插件:动态跟踪应用,类似JVM的AOP,不用修改部署的代码进行调试

4.3.3 其他工具(建议学会)

  • JMC(Java Mission Control):商业特性,低开销生产环境监控,配合Flight Recorder使用。
  • MAT(Memory Analyzer Tool):Eclipse出品,分析heap dump神器,可找出内存泄漏可疑对象。
  • Arthas:阿里开源Java诊断工具,在线分析线程、方法调用、堆内存等,无需重启应用。
相关推荐
weixin_444012936 小时前
如何在多实例管理时隐藏MySQL版本信息_安全混淆与配置
jvm·数据库·python
weixin_459753946 小时前
SQL处理大规模分组聚合的内存限制_调整服务器配置
jvm·数据库·python
野生技术架构师7 小时前
2026最新Java面试八股文天花板(含详细解析)
java·jvm·spring
m0_733565467 小时前
如何指定PHP版本运行phpMyAdmin_多版本共存配置
jvm·数据库·python
李白不吃坚果7 小时前
沟道电荷的思考
学习·cmos·集成电路·模拟集成电路设计·沟道电荷
学会870上岸华师7 小时前
C 语言程序设计——第一章课后编程题
c语言·开发语言·学习·算法
nashane7 小时前
HarmonyOS 6学习:AI攻略长截图“防抖”与像素级拼接术
学习·华为·harmonyos
香吧香8 小时前
Jstack定位生产环境线程阻塞问题解决
jvm·异常
解决问题no解决代码问题8 小时前
JAVA GC
java·开发语言·jvm
wangcheng3039 小时前
关键词优化怎么理解最清楚
笔记