日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
Java服務,內存OOM問題如何快速定位?

最近有朋友在知識星球提問:

我們提供的服務有:做網站、成都做網站、微信公眾號開發(fā)、網站優(yōu)化、網站認證、卓資ssl等。為成百上千企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的卓資網站制作公司

沈老師,有一個Java服務出現(xiàn)了OOM(Out Of Memory)問題,定位了好久不得其法,請問有什么好的思路么?

OOM的問題,印象中之前寫過,這里再總結一些相對通用的方案,希望能幫助到Java技術棧的同學。

某Java服務(假設PID=10765)出現(xiàn)了OOM,最常見的原因為:

  • 有可能是內存分配確實過小,而正常業(yè)務使用了大量內存
  • 某一個對象被頻繁申請,卻沒有釋放,內存不斷泄漏,導致內存耗盡
  • 某一個資源被頻繁申請,系統(tǒng)資源耗盡,例如:不斷創(chuàng)建線程,不斷發(fā)起網絡連接

畫外音:無非“本身資源不夠”“申請資源太多”“資源耗盡”幾個原因。

更具體的,可以使用以下工具逐一排查。

一、確認是不是內存本身就分配過小

方法:

 
 
 
 
  1. jmap -heap 10765 

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

二、找到最耗內存的對象

方法:

 
 
 
 
  1. jmap -histo:live 10765 | more 

如上圖,輸入命令后,會以表格的形式顯示存活對象的信息,并按照所占內存大小排序:

  • 實例數
  • 所占內存大小
  • 類名

是不是很直觀?對于實例數較多,占用內存大小較多的實例/類,相關的代碼就要針對性review了。

上圖中占內存最多的對象是RingBufferLogEvent,共占用內存18M,屬于正常使用范圍。

如果發(fā)現(xiàn)某類對象占用內存很大(例如幾個G),很可能是類對象創(chuàng)建太多,且一直未釋放。例如:

  • 申請完資源后,未調用close()或dispose()釋放資源
  • 消費者消費速度慢(或停止消費了),而生產者不斷往隊列中投遞任務,導致隊列中任務累積過多

畫外音:線上執(zhí)行該命令會強制執(zhí)行一次fgc。另外還可以dump內存進行分析。

三、確認是否是資源耗盡

工具:

  • pstree
  • netstat

查看進程創(chuàng)建的線程數,以及網絡連接數,如果資源耗盡,也可能出現(xiàn)OOM。 這里介紹另一種方法,通過

  • /proc/${PID}/fd
  • /proc/${PID}/task

可以分別查看句柄詳情和線程數。 例如,某一臺線上服務器的sshd進程PID是9339,查看

  • ll /proc/9339/fd
  • ll /proc/9339/task

如上圖,sshd共占用了四個句柄:

  • 0 -> 標準輸入
  • 1 -> 標準輸出
  • 2 -> 標準錯誤輸出
  • 3 -> socket(容易想到是監(jiān)聽端口)

sshd只有一個主線程PID為9339,并沒有多線程。

所以,只要

  • ll /proc/${PID}/fd | wc -l
  • ll /proc/${PID}/task | wc -l (效果等同pstree -p | wc -l)

就能知道進程打開的句柄數和線程數。

希望這1分鐘能幫到這位星球水友。

【本文為專欄作者“58沈劍”原創(chuàng)稿件,轉載請聯(lián)系原作者】

戳這里,看該作者更多好文


當前文章:Java服務,內存OOM問題如何快速定位?
網頁鏈接:http://www.5511xx.com/article/dhcceed.html