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诊断工具,在线分析线程、方法调用、堆内存等,无需重启应用。
相关推荐
Mr清奇19 分钟前
AI辅助开发笔记(1)开发工具和配置
大数据·笔记·intellij idea
Go Work22 分钟前
我把 @RefreshScope 挂错了类,新值一直灌不进去
经验分享·笔记
2603_969579281 小时前
U盘的系统备份怎样还原系统?详细步骤与注意事项
学习
知识分享小能手2 小时前
C学习教程,从入门到精通,C语言指针 —— 详细知识点总结(10)
c语言·开发语言·学习
Meteors.2 小时前
Android Compose学习02:基础组件与 Modifier
android·学习
云老大-阿里云国际站代理商2 小时前
华为云国际站渠道代理商:CSS查询很慢但CPU不高?磁盘I/O、JVM与分片问题怎么排查
css·jvm·华为云
ss2732 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 11 PostgreSQL安装部署常见问题排查与解决
数据库·笔记·postgresql
ab1237683 小时前
three.js 完整笔记
笔记·three.js
m4Rk_3 小时前
【论文阅读】Agent 记忆机制(102):UMA——用多个未来问题端到端训练一份共享记忆
论文阅读·人工智能·学习·开源·github
xxwl5853 小时前
第六章---计算几何
笔记·学习·算法