java服务OOM最常见的原因:
- 内存分配过小,而正常业务需要使用更大的内存;
- 某一个对象被频繁申请,确没有释放,内存不断泄露,导致内存耗尽;
- 某一个资源被不断申请,系统资源耗尽,如:不断创建线程,不断发起网路连接。
排查过程:
1、jmap -heap pid 查看堆内存分配:
jmap -heap -pid 确认内存本身是否分配过小,可以看到 新生代、老年代的参数配置。
C:\Users\Lenovo>jmap -heap 19676
Attaching to process ID 19676, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.152-b16
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4257218560 (4060.0MB)
NewSize = 88604672 (84.5MB)
MaxNewSize = 1418723328 (1353.0MB)
OldSize = 177733632 (169.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 = 127926272 (122.0MB)
used = 57173416 (54.524818420410156MB)
free = 70752856 (67.47518157958984MB)
44.69247411509029% used
From Space:
capacity = 16252928 (15.5MB)
used = 8648808 (8.248146057128906MB)
free = 7604120 (7.251853942871094MB)
53.21384552986391% used
To Space:
capacity = 15728640 (15.0MB)
used = 0 (0.0MB)
free = 15728640 (15.0MB)
0.0% used
PS Old Generation
capacity = 143130624 (136.5MB)
used = 18320840 (17.47211456298828MB)
free = 124809784 (119.02788543701172MB)
12.800083928929144% used
18607 interned Strings occupying 2382728 bytes.
2、查看该pid下线程对应的系统占用情况:
top -Hp pid
3、找到最耗内存的对象
jmap -histo:live pid | more
输入命令后,会议表格的形式显示存活的对象信息,并按照所占内存大小排序:
字段分别代表:实例树、所占内存大小、类名
C:\Users\Lenovo>jmap -histo:live 19676|more
num #instances #bytes class name
----------------------------------------------
1: 51966 8639472 [C
2: 50741 1217784 java.lang.String
3: 10865 956120 java.lang.reflect.Method
4: 8243 914968 java.lang.Class
5: 20954 670528 java.util.concurrent.ConcurrentHashMap$Node
6: 10233 495936 [Ljava.lang.Object;
7: 13700 438400 java.lang.ref.WeakReference
8: 9719 388760 java.util.LinkedHashMap$Entry
9: 4623 350712 [Ljava.util.HashMap$Node;
10: 10230 327360 java.util.HashMap$Node
11: 6991 279640 java.lang.ref.SoftReference
12: 4959 277704 java.util.LinkedHashMap
13: 1767 257336 [B
14: 3674 205744 java.beans.MethodDescriptor
15: 12034 192544 java.lang.Object
16: 7684 184416 java.beans.MethodRef
17: 111 183088 [Ljava.util.concurrent.ConcurrentHashMap$Node;
18: 3220 170120 [I
19: 7499 168048 [Ljava.lang.Class;
20: 6986 167664 java.util.ArrayList
21: 5245 154944 [Ljava.lang.String;
22: 3232 129280 org.springframework.util.ConcurrentReferenceHashMap$Segment
23: 3633 116256 java.util.concurrent.locks.ReentrantLock$NonfairSync
24: 3502 112064 java.lang.ref.ReferenceQueue
25: 993 95328 org.springframework.beans.GenericTypeAwarePropertyDescriptor
26: 3232 88440 [Lorg.springframework.util.ConcurrentReferenceHashMap$Reference;
27: 3474 83376 org.springframework.core.MethodClassKey
28: 3232 77568 org.springframework.util.ConcurrentReferenceHashMap$ReferenceManager
29: 1430 68640 java.util.HashMap
30: 947 68184 java.beans.PropertyDescriptor
31: 2578 61872 java.util.LinkedList$Node
32: 743 59440 java.lang.reflect.Constructor
33: 3504 56064 java.lang.ref.ReferenceQueue$Lock
34: 981 54936 java.lang.invoke.MemberName
35: 1358 54320 java.util.TreeMap$Entry
36: 1682 53824 java.util.LinkedList
37: 698 50256 org.springframework.core.annotation.AnnotationAttributes
-- More --
4、测试堆栈溢出:
jstat -gcutil pid 时间间隔毫秒
C:\Users\Lenovo>jstat -gcutil 19676 1000
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
0.00 0.00 4.90 10.01 94.82 92.16 11 0.073 4 0.182 0.255
- S0(即:from):幸存1区当前使用比例;
- S1(即:to):幸存2区当前使用比例;
- Eden:伊甸园区使用比例;
- Old:老年代使用比例;
- MetaSpace:元数据区使用比例;
- CCS:压缩使用比例;
- YGC:年轻代垃圾回收次数;
- YGCT:年轻代垃圾回收时间;
- FGC:老年代垃圾回收次数;
- FGCT:老年代垃圾回收消耗时间;
- GCT:垃圾回收消耗总时间 .
5、生成对应的pid的dump文件:
jmap -dump:format=b,file=heap.hprof pid
C:\Users\Lenovo>jmap -dump:format=b,file=heap.hprof 19676
Dumping heap to C:\Users\Lenovo\heap.hprof ...
Heap dump file created
注意:pid对应的项目是哪个用户启动的,就用哪个用户权限生成文件,否则会报错:Unable to open socket file:target process not responding or HotSpot VM not loaded.
6、heap.hprof 文件导出用MAT分析,可以用sz导出