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诊断工具,在线分析线程、方法调用、堆内存等,无需重启应用。
相关推荐
woai33642 小时前
JVM学习-基础篇-垃圾回收
java·jvm·学习
智者知已应修善业2 小时前
【51单片机4个IO实现16按键可扩展独立按键64矩阵驱动显示矩阵原值】2023-5-8
c++·经验分享·笔记·算法·51单片机
aP8PfmxS22 小时前
Lab3-page tables && MIT6.1810操作系统工程【持续更新】
java·linux·jvm
深蓝海拓2 小时前
S7-1500学习笔记:Array数据类型
笔记·学习·plc
Xudde.10 小时前
班级作业笔记报告0x04
笔记·学习·安全·web安全·php
晓晓hh11 小时前
JavaSE学习——迭代器
java·开发语言·学习
421!12 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
AI成长日志12 小时前
【笔面试算法学习专栏】双指针专题·简单难度两题精讲:167.两数之和II、283.移动零
学习·算法·面试
zzh08113 小时前
MySQL高可用集群笔记
数据库·笔记·mysql