Java服務OOM,最常見的原因爲:
(1)有可能是內存分配確實過小,而正常業務需要使用更大的內存;
(2)某一個對象被頻繁申請,卻沒有釋放,內存不斷泄露,導致內存耗盡;
(3)某一個資源被不斷申請,系統資源耗盡,例如:不斷創建線程,不斷髮起網絡連接
排查過程
如果知道具體服務和接口,可以ps -ef|grep java查看pid
1. jmap -heap pid 確認內存本身是否分配過小,可以看到新生代老生代的參數配置
[root@bird74 ~]# jmap -heap 6598
Attaching to process ID 6598, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
using thread-local object allocation.
Parallel GC with 18 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 32210157568 (30718.0MB)
NewSize = 715653120 (682.5MB)
MaxNewSize = 10736369664 (10239.0MB)
OldSize = 1431830528 (1365.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 = 3437756416 (3278.5MB)
used = 442139392 (421.656982421875MB)
free = 2995617024 (2856.843017578125MB)
12.861277487322708% used
From Space:
capacity = 81788928 (78.0MB)
used = 19657352 (18.74671173095703MB)
free = 62131576 (59.25328826904297MB)
24.03424580891927% used
To Space:
capacity = 117440512 (112.0MB)
used = 0 (0.0MB)
free = 117440512 (112.0MB)
0.0% used
PS Old Generation
capacity = 2432696320 (2320.0MB)
used = 131810152 (125.7039566040039MB)
free = 2300886168 (2194.296043395996MB)
5.418273991551892% used
51800 interned Strings occupying 5721192 bytes.
2. 查看該pid下 線程對應的系統佔用情況
top -Hp pid
3. 找到最耗內存的對象
jmap -histo:live pid | more
輸入命令後,會以表格的形式顯示存活對象的信息,並按照所佔內存大小排序:
字段分別代表實例數;所佔內存大小;類名
4. 測試堆棧溢出:jstat -gcutil <pid> 時間間隔毫秒 ;看下是否正常
- S0:倖存1區當前使用比例
- S1:倖存2區當前使用比例
- E:伊甸園區使用比例
- O:老年代使用比例
- M:元數據區使用比例
- CCS:壓縮使用比例
- YGC:年輕代垃圾回收次數
- YGCT:年輕代垃圾回收時間
- FGC:老年代垃圾回收次數
- FGCT:老年代垃圾回收消耗時間
- GCT:垃圾回收消耗總時間
5. 生成對應pid的dump文件
jmap -dump:format=b,file=heap.hprof <pid>
注意:pid對應的項目是哪個用戶啓動的,就用哪個用戶權限生成文件,否則會報錯 Unable to open socket file: target process not responding or HotSpot VM not loaded
6. heap.hprof文件 導出用MAT分析,可以用sz導出
- Histogram可以列出內存中的對象,對象的個數以及大小。
- Dominator Tree可以列出那個線程,以及線程下面的那些對象佔用的空間。
- Top consumers通過圖形列出最大的object。
- Leak Suspects通過MA自動分析泄漏的原因
更多MAT使用教程還是查一下吧
主要的流程在這裏,大家可以根據自己情況選擇
問題出來了要最快定位問題,緊急解決眼前問題讓業務正常,然後再優化