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诊断工具,在线分析线程、方法调用、堆内存等,无需重启应用。
相关推荐
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
XiHongShi20163 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
爱吃苹果的日记本3 天前
离散数学第六课
学习·离散数学
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
AI职业加油站3 天前
AI智能体应用工程师证书:政策红利下的职业新风口
大数据·运维·人工智能·学习·职场发展
深圳老胡3 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集