一次排查Java專案記憶體洩漏的過程
發現問題
公司自己維護的服務三四個,有的服務還分多個節點,自己也有幾個私人伺服器,所以為了能實時知道各個伺服器的情況,就使用ServerStatus做了個雲探針,功能很簡單,能實時的監控每個伺服器的記憶體、cpu、硬碟、流量的使用情況,如下
雖然只有幾個指標,但是已經能讓我全面的掌握各服務的效能,再搭配chrome外掛iChrome,每天開啟瀏覽器就能第一時間看到監控介面,
我始終相信一句話:
工欲善其事必先利其器
最近一段時間,我發現我的一個服務所在的兩臺伺服器記憶體處於不停的增長狀態,8g記憶體,直接超過65%,這讓我很鬱悶,為什麼會醬紫,就在昨天,我在一個伺服器上做測試(不是普通的測試,而是去驗證某正邏輯線上上是否正確的測試),然後整個服務直接當機了,趕緊找公司的運維人員(你可能會問既然公司有運維,為什麼還要自己搗鼓監控,我想說,作為一個開發,最好能在第一時間發現任何問題,還有一句話“求人不如求幾”)看下伺服器當機前的狀態,果然是記憶體突然暴增,所以我就很有必要去找出導致服務記憶體持續增長原因。
jmap
網上找了一些命令,感覺jmap最好用
命令列輸入:jmap -histo <pid> | head -20
,就可以檢視某個pid的java服務佔用記憶體排名前20的類。注:該命令不適用於Windows系統裡
jmap -dump:format=b,file=filename.bin <pid>
, 將整個記憶體情況儲存到檔案裡,然後匯出使用MAT(Memory Analyse Tool)分析
注意:堆轉儲檔案可能比較大,我的有2.5個G
MAT
Memory Analyse Tool 記憶體分析工具,直接下載,下載解壓之後,可以修改下配置檔案MemoryAnalyzer.ini,修改裡面的引數如-Xmx5120m
(最好要大於你的堆轉儲檔案)
點選“Leak Suspects”一般會顯示MAT它自己認為有問題的內容,如下
同時會在堆轉儲檔案的同級目錄下生成一個壓縮檔案filename_Leak_Suspects.zip,裡面是一個html靜態頁面,我們也可以在瀏覽器去分析
點選“Accumulated Objects in Dominator Tree”
就可以看到問題所在了
發現WordDictionary中HashMap的數量異常,然後一層一層的網上找,發現了這句程式碼
public class xxx {
private JiebaSegmenter segmenter = new JiebaSegmenter(); // 分詞
}
然而專案裡對這個xxx類依賴較多,每次使用xxx的時候,都要重新去建立JiebaSegmenter物件。。。。
趕緊將其改為
private static JiebaSegmenter segmenter = new JiebaSegmenter(); // 分詞
因為這個分詞程式是直接在github上面找的程式碼,所以沒有認真去看,真的是應了那句話“該來的遲早會來~~~”
最後
以上就是自己通過記憶體分析定為到具體程式碼的整個過程,之類MAT用的很簡單,只是簡單的分析,也可以參考這篇https://blog.csdn.net/wanghuiqi2008/article/details/50724676,整個過程很順暢,當然了還需要對自己程式碼非常熟才行,否則半天都不會定位到問題。
今天是七夕,祝各位程式設計師早早下班,陪女友吃好喝好玩好為愛鼓掌到天明~~~~
相關文章
- 記一次使用windbg排查記憶體洩漏的過程記憶體
- 一次 Java 記憶體洩漏的排查Java記憶體
- 記一次 Java 應用記憶體洩漏的定位過程Java記憶體
- 記一次"記憶體洩露"排查過程記憶體洩露
- 記錄一次記憶體洩漏排查過程記憶體
- 一次 Java 記憶體洩漏排查過程,漲姿勢Java記憶體
- 記一次堆外記憶體洩漏排查過程記憶體
- 記一次 Ruby 記憶體洩漏的排查和修復記憶體
- 記一次透過Memory Analyzer分析記憶體洩漏的解決過程記憶體
- Andriod專案記憶體洩漏流程記憶體
- redisson記憶體洩漏問題排查Redis記憶體
- Java記憶體洩漏Java記憶體
- ASR專案實戰-交付過程中遇到的疑似記憶體洩漏問題記憶體
- 一次Kafka記憶體洩露排查經過Kafka記憶體洩露
- 記一次尷尬的Java應用記憶體洩露排查Java記憶體洩露
- 記一則伺服器記憶體洩漏解決過程伺服器記憶體
- 記一次堆外記憶體洩漏分析記憶體
- Java記憶體洩漏解決之道Java記憶體
- java記憶體溢位和記憶體洩漏的區別Java記憶體溢位
- 分析記憶體洩漏和goroutine洩漏記憶體Go
- 記憶體洩漏的原因記憶體
- 記憶體洩漏的定位與排查:Heap Profiling 原理解析記憶體
- luajit表記錄監控(憶一次專案上線中遇到的luajit物件記憶體洩漏)物件記憶體
- 納尼,Java 存在記憶體洩洩洩洩洩洩漏嗎?Java記憶體
- [Java基礎]記憶體洩漏和記憶體溢位Java記憶體溢位
- Java棧溢位|記憶體洩漏|記憶體溢位Java記憶體溢位
- java專案cpu或記憶體過高,排查問題思路Java記憶體
- 記憶體洩漏與排查流程——安卓效能優化記憶體安卓優化
- jvm 記憶體洩漏JVM記憶體
- Android 記憶體洩漏Android記憶體
- js記憶體洩漏JS記憶體
- Android記憶體洩漏Android記憶體
- 翻譯 | 理解Java中的記憶體洩漏Java記憶體
- 記一次使用 laravel-s 記憶體洩漏Laravel記憶體
- Java應用程式中的記憶體洩漏及記憶體管理Java記憶體
- 一波三折!記一次非堆記憶體洩漏(CXF+Jackson)的排查記憶體
- 一次glide記憶體洩漏排查分析IDE記憶體
- WebView引起的記憶體洩漏WebView記憶體