JVM 的 Dump分析以及 GC 日志

发布于:2025-06-29 ⋅ 阅读:(22) ⋅ 点赞:(0)

Dump

Dump 文件是什么?

dump文件是一个进程或者系统在某一个给定的时间的快照,包含了一些程序运行时的各种信息,一般是被专业人员用来分析获取信息,然后给程序调试排错。在服务器运行我们的Java程序时,是无法跟踪代码的,所以当发生线上事故时,dump文件就成了一个很关键的分析点。简单来说内存快照。

Dump 文件怎么获得?

方式 1:自动获得

1、出现 OOME 时生成堆 dump: -XX:+HeapDumpOnOutOfMemoryError

2、生成堆文件地址:-XX:HeapDumpPath=/opt/logs/myService/HeapDumpOnOutOfMemoryError/

java -Xms2048m -Xmx2048m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/logs/myService/HeapDumpOnOutOfMemoryError/ 
-jar myService.jar

方式 2:手工执行,立即生成成当前JVM的dmp文件,1234是指Java程序的PID

[root@k8s ~]# ps -ef|grep myService
root     1234 3542583  0 09:40 pts/2    00:00:23 java -jar myService.jar
jmap -dump:format=b,file=dumplog.hprof 1234

Dump 文件的分析工具-Jrofiler

用来分析 dump文件

实战:排查内存溢出OOM 问题

重点:当前对象集、最大对象

传入引用 查看持有改对象的所有引用

出现 OOM 问题原因:可能是对象分配太大,或者堆内存不足,适当增加堆内存,合理配置堆内存的比例,以及进入老年代的大对象大小

# 初始堆大小 (建议设置为最大堆的1/4到1/2)
-Xms4g 

# 最大堆大小 (根据服务器可用内存设置,通常不超过物理内存的80%)
-Xmx8g

# 年轻代大小 (建议为堆的1/3到1/2)
-XX:NewSize=3g
-XX:MaxNewSize=3g

# 或者使用比例设置年轻代 (推荐)
-XX:NewRatio=2  # 年轻代与老年代比例为1:2

# 设置大对象直接进入老年代的阈值 (默认约1MB)
-XX:PretenureSizeThreshold=2m

# 并行收集器相关配置 (适用于大对象)
-XX:+UseParallelGC  # 或 UseG1GC / UseConcMarkSweepGC
-XX:ParallelGCThreads=4  # 根据CPU核心数调整

实战: 内存泄露

内存泄露的表现:

老年代逐步增长 FullGC 频繁、老年代、年轻代的内存一直处于高位无法释放

检测:

  1. 在应用启动后不久获取第一个堆快照

  2. 运行一段时间后获取第二个快照

  3. 使用 Compare 功能对比两个快照,查看哪些类实例增长最多

     4. 观察哪一个类实例比较多,一直不衰减,一直在增长

GC 日志

GC 日志获取

分析 GCeasy


网站公告

今日签到

点亮在社区的每一天
去签到