JVM-堆-监控-03
jps :查看当前java进程
jps -l : 显示应用程序主类的完整包名或应用程序JAR文件的完整路径名
jsp -m: 显示传递给主方法的参数。对于嵌入式JVM,输出可能为null
jps -v:显示传递给JVM的参数
1、首先启动java 程序,并指定使用G1垃圾回收期
# nohup java +XX:UseG1GC -jar test.jar &
2、 查看java进程
# ps -ef |grep java
3、输入jps 查看 java 进程

jinfo:查看正在运行的jvm的参数值
jinfo pid
jinfo -flags pid
jinfo -flag 属性 pid
看状态 jinfo -flag UseConcMarkSweepGC pid
看数值 jinfo -flag MaxHeapSize pid
1、查看进程id 或者直接jps也可以查找到pid
2、使用 jinfo 查看运行的jvm 参数值,出来很多信息
# jps
# jinfo 2837


3、使用 jinfo -flags pid 查看(jinfo -flags <pid> 命令用于 查看指定Java进程(JVM)的完整运行时参数配置)

3、使用 jinfo -flag pid 查看
[root@demo]# jinfo -flag UseConcMarkSweepGC 2837
-XX:-UseConcMarkSweepGC
[root@demo]# jinfo -flag UseG1GC 2837
-XX:+UseG1GC
[root@demo]# jinfo -flag UseG1GC1 2837
no such flag 'UseG1GC1
4、使用 jinfo -flag 属性 pid 查看 堆的最大内存
[root@demo]# jinfo -flag MaxHeapSize 2837
-XX:MaxHeapSize=517996544
[root@demo]#
典型使用场景
| 场景 | 命令示例 | 用途 |
|---|---|---|
| 检查垃圾回收器配置 | jinfo -flags 1234 |
确认是否启用G1/CMS/ZGC等 |
| 诊断内存溢出问题 | 结合 -XX:MaxHeapSize |
验证堆内存是否合理 |
| 排查编码问题 | 检查 -Dfile.encoding |
确认系统默认编码 |
| 对比环境差异 | 对比不同环境的flags输出 | 定位参数配置不一致导致的性能问题 |
jstat :-gc 查看垃圾回收信息
jstat -gc 1000 [n]
1、查看进程id 或者直接jps也可以查找到pid
2、使用 jinfo 查看运行的jvm 参数值,出来很多信息
# jstat -gc 1000 3 每一秒打印一次,总共打印三次
# jstat -gc 2000 2 每2秒打印一次,总共打印2次
# jstat -gc 2000 每2秒打印一次,一直打印
[root@demo]# jstat -gc 2837 1000 2
S0C S1C S0U S1U EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
0.0 3072.0 0.0 3072.0 24576.0 9216.0 37888.0 26624.0 46848.0 43816.8 6400.0 5822.1 38 0.401 0 0.000 0.401
0.0 3072.0 0.0 3072.0 24576.0 9216.0 37888.0 26624.0 46848.0 43816.8 6400.0 5822.1 38 0.401 0 0.000 0.401
单位都是kb
S0C-》 S0 总的大小
S1C-S1 总的大小
S0U -S0 使用的大小
EC -Eden 伊甸园区使用的大小
OC -old区使用的大小
CCSU -方法区使用的大小
YGC - 年轻代垃圾回收的次数
YGCT -年轻代垃圾回收所消耗的时间
FGC - full GC 的次数
GCT -垃圾回收所消耗总的时间
3、jstat -gcutil pid 1000
[root@demo]# jstat -gcutil 2837 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401
4、jstat -gccause pid 1000
jstat -gccause <pid> 1000 是一个用于监控 Java 虚拟机(JVM)垃圾回收(GC)统计信息和最近一次 GC 原因的常用命令。以下是详细说明:
命令解析:
-
jstat:JDK 自带的 JVM 统计监控工具。 -
-gccause:选项表示输出 GC 原因(Cause)以及 上次 GC 的原因。 -
<pid>:目标 Java 进程的进程 ID。 -
1000:每隔 1000 毫秒(1 秒)输出一次统计信息。
G1GC
[root@demo]# jstat -gccause 2837 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
0.00 100.00 37.50 70.27 93.53 90.97 38 0.401 0 0.000 0.401 G1 Evacuation Pause No GC
默认GC
[root@demo]# jstat -gccause 4186 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 65.71 85.54 48.63 93.18 89.85 11 0.959 2 0.211 1.170 Allocation Failure No GC
0.00 65.71 85.54 48.63 93.18 89.85 11 0.959 2 0.211 1.170 Allocation Failure No GC
0.00 65.71 85.54 48.63 93.18 89.85 11 0.959 2 0.211 1.170 Allocation Failure No GC
LGCC 上次垃圾啊回收的原因
GCC:当前垃圾回收
jmap:查看堆内存信息
1、 jmap -heap pid
[root@demo]# jmap -heap 4186
Attaching to process ID 4186, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.211-b12
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 517996544 (494.0MB)
NewSize = 11010048 (10.5MB)
MaxNewSize = 172490752 (164.5MB)
OldSize = 22544384 (21.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 149422080 (142.5MB)
used = 127813264 (121.89222717285156MB)
free = 21608816 (20.607772827148438MB)
85.53840503358005% used
From Space:
capacity = 11534336 (11.0MB)
used = 7579680 (7.228546142578125MB)
free = 3954656 (3.771453857421875MB)
65.71405584161931% used
To Space:
capacity = 11534336 (11.0MB)
used = 0 (0.0MB)
free = 11534336 (11.0MB)
0.0% used
PS Old Generation
capacity = 35651584 (34.0MB)
used = 17336288 (16.533172607421875MB)
free = 18315296 (17.466827392578125MB)
48.62697825712316% used
17065 interned Strings occupying 1530264 bytes.
You have new mail in /var/spool/mail/root
2、jmap -histo pid 查看对象统计信息
# jmap -histo 4186 会查询出很多西悉尼,因此可以用下面的
# jmap -histo 4186 | head -23
jmap -histo 4186 | head -23 是一个用于 快速诊断 Java 堆内存对象分布 的命令,它会输出指定 Java 进程(PID 4186)堆内存中占用最多的对象类型,并截取前 23 行关键信息。
[root@demo]# jmap -histo 4186 | head -23
num #instances #bytes class name
----------------------------------------------
1: 432760 78988168 [C
2: 44599 16415384 [B
3: 31609 11866640 [I
4: 277988 6671712 java.lang.String
5: 51977 3505584 [Ljava.lang.Object;
6: 45900 2937600 java.net.URL
7: 112056 2296864 [Ljava.lang.Class;
8: 23781 2092728 java.lang.reflect.Method
9: 21528 1725568 [Ljava.util.WeakHashMap$Entry;
10: 21397 1369408 org.springframework.boot.loader.jar.JarFileWrapper
11: 39788 1273216 java.util.concurrent.ConcurrentHashMap$Node
12: 38075 1218400 org.springframework.boot.loader.jar.StringSequence
13: 27337 1093480 java.lang.ref.Finalizer
14: 9463 1038976 java.lang.Class
15: 21514 1032672 java.util.WeakHashMap
16: 38075 913800 org.springframework.boot.loader.jar.JarURLConnection$JarEntryName
17: 21774 870960 java.util.LinkedHashMap$Entry
18: 11086 862976 [Ljava.util.HashMap$Node;
19: 22559 721888 java.lang.ref.ReferenceQueue
20: 8746 693600 [S
jmap -histo 10874 | less 是一个用于 交互式浏览 Java 堆内存对象分布 的命令,它结合了 jmap 的内存统计功能和 less 的分页查看工具。性能压测中的 OAM 场景
-
核心作用
在压测过程中,OAM 系统负责:-
实时监控:跟踪服务器CPU、内存、网络I/O、数据库连接池等关键指标。
-
故障告警:自动检测异常(如接口超时、错误率飙升)并触发告警。
-
日志收集:记录压测期间的详细日志,供后续分析瓶颈。
-
-
典型问题与OAM的关联
-
资源泄漏:OAM 监控到内存或线程数持续增长,可能提示代码未释放资源(如数据库连接未关闭)。
-
配置错误:OAM 发现某服务线程池配置过小,导致压测时请求排队。
-
网络瓶颈:OAM 显示带宽占用饱和,需调整负载均衡策略。
-
OAM 在压测中的关键工具
工具/组件 用途 示例 Prometheus+Grafana 实时监控指标可视化 观察QPS、延迟、错误率变化曲线 ELK Stack 集中分析压测日志 搜索高频错误日志(如 TimeoutException)Zabbix/Nagios 阈值告警 CPU超过90%时邮件通知团队 APM工具(如SkyWalking) 追踪分布式链路性能 定位慢调用链(如某个微服务接口耗时突增) 手动dump 命令:jmap -dump:live,format=b,file=heap.bin 4168(pid)
[root@demo]# jmap -dump:live,format=b,file=heap.bin 4186
Dumping heap to /root/demo/heap.bin ...
Heap dump file created
[root@demo]# ls
heap.bin nohup.out testdemo test.txt_bak
[root@demo]#
dump 文件 heap.bin 后,通过MAT工具去分析,看是哪个对象占用了过多内容,到底是内部程序导致的,还是什么导致的OMA.
在 Java 性能分析和内存泄漏排查中,MAT(Memory Analyzer Tool) 是一款专用于分析 Java 堆转储文件(Heap Dump)的强大工具。它可以帮助开发者快速定位内存消耗过高、对象泄漏等问题的根源
. MAT 是什么?
-
全称:Eclipse Memory Analyzer Tool(独立版或 Eclipse 插件)。
-
核心功能:解析由
jmap、jcmd或 OOM 自动生成的堆转储文件(如heap.bin),提供可视化分析。 -
适用场景:
-
内存泄漏(Memory Leak)诊断。
-
大对象(Retained Heap)占用分析。
-
对象引用链追踪。
-
4. 实际案例演示
问题现象:
压测时 JVM 内存持续增长,Full GC 无法回收,最终 OOM。
MAT 分析过程:
-
生成堆转储:
jmap -dump:live,format=b,file=heap.bin 4168
-
MAT 加载文件:
-
发现
com.example.OrderService的实例占用了 80% 内存。
-
-
引用链分析:
-
该对象被一个全局的
ConcurrentHashMap缓存持有,无过期策略。
-
-
解决方案:
-
改用
Caffeine缓存并设置TTL,或定期清理缓存。-
6. 替代工具对比
工具 优势 劣势 MAT 深度引用分析,自动化报告 大堆文件解析慢 VisualVM 轻量级,实时监控 分析功能较弱 JProfiler 商业版,集成 CPU/内存分析 付费
-
-
-
-
-
jstat -gccause <pid> 1000 是一个用于监控 Java 虚拟机(JVM)垃圾回收(GC)统计信息和最近一次 GC 原因的常用命令。以下是详细说明:
命令解析:
-
jstat:JDK 自带的 JVM 统计监控工具。 -
-gccause:选项表示输出 GC 原因(Cause)以及 上次 GC 的原因。 -
<pid>:目标 Java 进程的进程 ID。 -
1000:每隔 1000 毫秒(1 秒)输出一次统计信息。

浙公网安备 33010602011771号