線上問題定位三板斧之OOM篇

聲明:本文整理自 https://mp.weixin.qq.com/s/iOC1fiKDItn3QY5abWIelg


大家線上應該都或多或少的遇到過OOM異常,那麼怎麼確定問題出現在哪裡呢?接下來介紹下解決這類問題的「三板斧」。

思路:

  • 使用了默認內存或者調整過小的內存

  • 某一個對象被頻繁申請,卻沒有釋放,內存不斷泄漏,導致內存耗盡

  • 某一個資源被頻繁申請,系統資源耗盡,例如:不斷創建線程,不斷發起網路連接

解決:

就用上文中提到的jmap

獲取對應的java進程(jps或者ps),例如獲取的pid為:11057

  1. 查詢內存空間大小信息

jmap -heap 11057

(jmap -heap 詳解請參考:http://blog.csdn.net/u014227228/article/details/41858031)

Advertisements

可以查看新生代,老生代堆內存的分配大小以及使用情況,看是否本身分配過小。

2.尋找大對象

jmap -histo:live 11057| more

實例數、佔用空間、類名一目了然

3.查詢資源是否耗盡

進程創建的線程、網路連接數等如果過多也會消耗過多內存,出現OOM異常。

a).可使用pstree(可參考:http://www.cnblogs.com/0616--ataozhijia/p/4015465.html)、netstat(可參考:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316661.html)

b).使用/proc/{pid}/fd和 /proc/{pid}/task

Advertisements

/proc/{pid}/fd 展示的是該進程所持有句柄列表

/proc/{pid}/task 展示的是該進程所持有網路連接列表


歡迎大家交流

Advertisements

你可能會喜歡