JVM 的 Dump分析以及 GC 日志
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 频繁、老年代、年轻代的内存一直处于高位无法释放
检测:
-
在应用启动后不久获取第一个堆快照
-
运行一段时间后获取第二个快照
-
使用 Compare 功能对比两个快照,查看哪些类实例增长最多
4. 观察哪一个类实例比较多,一直不衰减,一直在增长