線上問題定位三板斧之OOM篇
聲明:本文整理自 https://mp.weixin.qq.com/s/iOC1fiKDItn3QY5abWIelg
大家線上應該都或多或少的遇到過OOM異常,那麼怎麼確定問題出現在哪裡呢?接下來介紹下解決這類問題的「三板斧」。
思路:
使用了默認內存或者調整過小的內存
某一個對象被頻繁申請,卻沒有釋放,內存不斷泄漏,導致內存耗盡
某一個資源被頻繁申請,系統資源耗盡,例如:不斷創建線程,不斷發起網路連接
解決:
就用上文中提到的jmap
獲取對應的java進程(jps或者ps),例如獲取的pid為:11057
查詢內存空間大小信息
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 展示的是該進程所持有網路連接列表
歡迎大家交流