Java OOM原因以及問題分析排查步驟

 

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使用教程還是查一下吧

主要的流程在這裏,大家可以根據自己情況選擇

問題出來了要最快定位問題,緊急解決眼前問題讓業務正常,然後再優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章