JAVA OOM问题排查记录
问题描述
实际开发中有个定时任务的应用,运行一段时间后就会OOM,通过jvm的各种监控来排查OOM的原因,特此记录在这里。
内容引用
常用命令
1、top
查询CPU占用情况以及进程PID
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24988 root 20 0 59508 4152 3620 R 0.3 0.0 0:00.01 top
1 root 20 0 4320 724 648 S 0.0 0.0 0:00.09 tini
6 root 20 0 15088 3152 2912 S 0.0 0.0 0:00.00 bash
7 root 20 0 15088 2060 1808 S 0.0 0.0 0:00.00 bash
9 root 20 0 26064 2796 2176 S 0.0 0.0 0:00.00 crond
10 root 20 0 31.759g 2.635g 17944 S 0.0 1.0 2:12.83 java
77 root 20 0 15216 3460 3088 S 0.0 0.0 0:00.03 sh
10250 root 20 0 25160 2516 2272 S 0.0 0.0 0:00.00 anacron
24981 root 20 0 15216 3456 3096 S 0.0 0.0 0:00.01 sh
2、jmap -heap pid
显示Java堆详细信息,打印一个堆的摘要信息,包括使用的GC算法、堆配置信息和各内存区域内存使用信息
Attaching to process ID 10, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 6442450944 (6144.0MB)
NewSize = 2147483648 (2048.0MB)
MaxNewSize = 2147483648 (2048.0MB)
OldSize = 4294967296 (4096.0MB)
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 = 1989672960 (1897.5MB)
used = 637523032 (607.9893417358398MB)
free = 1352149928 (1289.5106582641602MB)
32.041599037461914% used
From Space:
capacity = 79167488 (75.5MB)
used = 21287720 (20.301551818847656MB)
free = 57879768 (55.198448181152344MB)
26.88947260774524% used
To Space:
capacity = 78643200 (75.0MB)
used = 0 (0.0MB)
free = 78643200 (75.0MB)
0.0% used
PS Old Generation
capacity = 4294967296 (4096.0MB)
used = 53744560 (51.25480651855469MB)
free = 4241222736 (4044.7451934814453MB)
1.2513380497694016% used
35830 interned Strings occupying 3985440 bytes.
3、jmap -histo:live pid
显示堆中对象的统计信息,其中包括每个Java类、对象数量、内存大小(单位:字节)、完全限定的类名。打印的虚拟机内部的类名称将会带有一个’*’前缀。如果指定了live子选项,则只计算活动的对象。
num #instances #bytes class name
----------------------------------------------
1: 313902 20147600 [C
2: 324481 7787544 java.lang.String
3: 8832 3892128 [B
4: 36272 3191936 java.lang.reflect.Method
5: 9066 2024104 [I
6: 62343 1994976 java.util.HashMap$Node
7: 62213 1990816 java.util.concurrent.ConcurrentHashMap$Node
8: 14484 1610080 java.lang.Class
9: 24598 1497704 [Ljava.lang.Object;
10: 4082 1077648 com.auto.hr.ppi.base.ppitask.domain.DO.TEmployeeDO
11: 9091 1069376 [Ljava.util.HashMap$Node;
12: 43927 1054248 java.util.Date
13: 34158 754920 [Ljava.lang.Class;
14: 15543 621720 java.util.LinkedHashMap$Entry
15: 490 515568 [Ljava.util.concurrent.ConcurrentHashMap$Node;
16: 6889 496008 java.lang.reflect.Field
17: 8731 488936 java.util.LinkedHashMap
18: 30178 482848 java.lang.Object
19: 6300 403200 com.mysql.jdbc.ConnectionPropertiesImpl$BooleanConnectionProperty
20: 4756 380480 java.lang.reflect.Constructor
21: 7618 365664 java.util.HashMap
4、jmap -dump:format=b,file=heapdump.bin pid
生成堆转储快照dump文件
sh-4.2# jmap -dump:format=b,file=heapdump.bin 10
Dumping heap to /a-one/bin/heapdump.bin ...
Heap dump file created
5、sz heapdump.bin
下载导出的堆快照dump文件,导入到MAT工具中