1. 程式人生 > >記一次記憶體洩漏排查問題

記一次記憶體洩漏排查問題

原文連結: 連結

背景

     在使用JavaCV做影象處理時,發現程式執行起來之後,處理了百來次的時候,就報了outofmemory的錯誤。因為javacv底層就是呼叫opencv的native方法,判斷是出現了記憶體洩漏問題,可能是呼叫了哪個方法之後沒有正確釋放資源。

1.用jconsole觀察

     首先是需要在測試機器上修改啟動命令,使得能夠支援jconsole遠端連線。

-Dcom.sun.management.jmxremote.port=8999 \  
-Dcom.sun.management.jmxremote.authenticate=false \  
-Dcom.sun
.management.jmxremote.ssl=false

     這樣,啟動本地java安裝目錄bin下的jconsole.exe啟動介面,輸入遠端主機的IP和8999埠,就可以連線上了。

     這個圖是正常的垃圾回收。當時的圖是隻有上升,沒有下降的一個過程,然後到頂點就產生了outofmemory錯誤。

2.排查

     網上查詢了一下記憶體洩漏的分析工具,給eclipse安裝了MAT外掛用於分析檔案。為了生成hprof檔案,在測試機器上多次呼叫方法,直到根據jconsole發現快到頂點了,執行以下命令:

jmap -dump:format=b,file
=a.hprof 24957 //後面的24957是程序ID可用下面命令get ps -ef|grep java 然後找到專案名對應的pid即可

     生成的檔案直接用裝了MAT外掛的eclipse開啟即可:

     可以看到圖中很明顯的第三方庫的類名,就可以判斷可能是在用該類的地方的資源沒釋放,然後對應地查詢。當然MAT和jconsole還有更強大的功能等著大家去使用
     Objects : 類的物件的數量,這個物件被建立了多少個
     shallowHeap是指一個物件記憶體的消耗大小,不包含對其他物件的引用。
     Retained Heap :是shallow Heap的總和,也就是該物件被GC之後所能回收到記憶體的總和。


     該篇部落格中具體介紹了shallowheap和retainedHeap:
http://bjyzxxds.iteye.com/blog/1532937
     這裡說一句題外話,在使用這幾個類的地方,發現用完之後已經呼叫了釋放方法,很是奇怪,也沒頭緒。後面想到跟javacv給的sample code對比一下,發現網上流傳的釋放方法和樣例中的並不一致,也可能是因為使用的版本不同導致的。改成樣例中的方法之後,解決了該問題。得到的教訓是如果第三方庫有示例程式碼,還是得多參考示例程式碼。
     最終再用jconsole連線機器,觀察記憶體回收,就得到了上面那個圖。還有下面這個圖:

     這裡看到使用的回收演算法是新生代是parNew,老年代是CMS。老年代演算法中,CMS算是用的較多的演算法,而新生代演算法中,除了serial收集器,只有parNew能與CMS配合使用。parNew與serial相比,只是多執行緒,沒有其他創新之處。順勢複習了一波垃圾回收演算法,做了下面這樣一個幾種收集演算法對比:
     連結:https://www.processon.com/view/587a409de4b098bf4ca43bf7

相關推薦

記憶體洩漏排查問題

原文連結: 連結 背景      在使用JavaCV做影象處理時,發現程式執行起來之後,處理了百來次的時候,就報了outofmemory的錯誤。因為javacv底層就是呼叫opencv的native方法,判斷是出現了記憶體洩漏問題,可能是呼叫了哪個方法之

記憶體洩漏問題

nohup java -Xmx4G -Xms4G -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/xxx.dump -jar xxx>x

使用windbg排查記憶體洩漏的過程

一、背景   近期有一個專案在運行當中出現一些問題,程式順利啟動,但是觀察一陣子後發現記憶體使用總量在很緩慢地升高, 雖然偶爾還會往下降一些,但是總體還是不斷上升;記憶體執行6個小時候從33M上升到80M;   程式存在記憶體洩漏是確定無疑的了,大概出問題的方向也知道,就是程式新加入一個採集協議(BACnet

記憶體溢位問題的排查、分析過程及解決思路

謹以此文獻給自學路上的兄弟 起因 這個測試工具的開發已有一段時間了,由於資料量過大,寫入資料較慢,導致工具執行耗時較長,所以再次優化了實現方案,進行二階段的程式開發。 經優化後,2000 條資料寫入,耗時4秒,個人感覺,快了很多了。 於是,想批量執行下,看下耗時多長。 結果10分鐘、20分鐘、1 個小時過

記憶體溢位查詢的問題

情景:今天測試環境發現應用出現記憶體溢位的問題。這是從來沒有出現過的問題,在關閉此次版本新上線的功能後仍發現Perm區的記憶體持續在增長。 jdk版本:1.7 環境:linux ====================================================== 起因:測試環境

[Android] FileDescriptor洩漏造成的Crash

記一次FileDescriptor洩漏造成的Crash 問題描述 最近專案中一直偶現Native Crash,先看下log。 09-29 10:46:47.530 24328-24328/? A/libc: Fatal signal 6 (SIGABRT), c

記憶體告警

個人部落格原文: 記一次記憶體告警 今天給大家分享一次生產上遇到的記憶體問題。 生產上的一個應用經常執行一段時間後就記憶體告警,在一次告警中,先 dump 了記憶體下來,然後再重啟了應用。 dump 命令: jmap -dump:format=b,file=memory.pro {pid

記憶體洩露優化過程

背景 專案目前存在使用久了或者重複開啟關閉某個頁面,記憶體會一直飆升,居高不下,頻繁發生GC。靜置一段時間後,情況有所改善,但是問題依舊明顯,如圖1-1、1-2。 圖1-1.操作時的記憶體使用情況 圖1-2.靜置時的記憶體使用情況 如上圖1-1,

記憶體洩漏問題定位過程與分析

現場: 邏輯server伺服器處理能力驟降, 客戶端請求大量失敗.  邏輯server的統計資料顯示,請求量略有增長(客戶端重試的結果), log內容顯示訪問外部介面有一定失敗. 分析: 第一反應是外部介面失敗導致程序處理堵塞,大量請求被堵塞後丟棄導致客戶端重試.

解決Bug之路:記憶體溢位問題的查詢

JVM記憶體溢位的問題定位一直是個比較棘手的問題,日常開發專案中出現了記憶體溢位的情況,針對這種情況,本次通過分析dump檔案,快速定位問題,實錘Bug的源頭 步驟: 1、檢視日誌檔案 伺服器記憶體溢位報警,通過檢視日誌,初步懷疑查詢的資料過多,造成記憶體溢位。

記憶體洩露排查

018-04-20 11:36:01:ERROR http-bio-8888-exec-8 cn.shibei.feixia.handler.ControllerExceptionHandler.handledException(ControllerExceptionHan

MongoDB故障排查的過程

資料技術嘉年華等你來預告:11.16-17日,北京市東三環中路61號富力萬麗酒店,相聚資料技術嘉

記憶體溢位的分析經歷——thrift帶給我的痛orz

說在前面的話朋友,你經歷過部署好的服務突然記憶體溢位嗎?你經歷過沒有看過Java虛擬機器,來解決記憶體溢位的痛苦嗎?你經歷過一個BUG,百思不得其解,頭髮一根一根脫落的煩惱嗎?我知道,你有過!但是我還是要來說說我的故事..................背景:有一個專案做一個

線上問題排查

  這周在上線一個功能的時候,碰到了“fail to respond”問題(上一篇文章),問題雖然解決了,但是解決的過程很痛苦,走了很多彎路,我覺得有必要記錄下來。   情景還原:專案A(公司內部專案),專案A裡面有呼叫專案B的介面(專案B是公司接入的第三方專案,類似於ra

記憶體溢位(PermGen Space)的坑

環境:JDK1.6  使用技術:URLClassLoader 事件描述:使用URLClassLoader類載入器,實現熱部署。定時任務載入jar包,任務執行300次左右就會報:PermGen Space 分析過程:   1.檢視記憶體使用情況: jmap -heap

記憶體溢位的分析經歷

開發十年,就只剩下這套架構體系了! >>>   

【問題記錄】ConnectionTimeout問題排查

最近做效能測試時,發現連線第三方系統時會有約1%的交易提示如下錯誤 ```java nested exception is org.apache.commons.httpclient.ConnectTimeoutException: The host did not accept the connectio

記憶體飆升的Windbg

# 背景 突然間接到運維的報警,我們一個服務,記憶體找過了6GB的佔用。才6GB 也不是很大,因為在處理別的事情,服務dump一下暫時一放,然後半小時之後,接到了運維的Kafka堆積報警。然後切換著重啟了一下兩個節點,Kafka消費速率回覆正常,記憶體也從500M攀升到2GB後逐漸穩定。當天半夜,運維又報警

將一個@RequestMapping定義的方法對映為兩個http服務----有趣的排查問題過程

小夥伴遇到個問題,某個controller釋出的http服務直接訪問沒問題,通過nginx轉發後就報404,此模組其他url訪問都正常。。   controller程式碼如下: @RequestMapping("/addrExport.spr") public class AddrExportC

尷尬的Java應用記憶體洩露排查

這星期被線上JVM記憶體佔用不斷增大的問題所困擾,自己提出了一些假設,然後去實施驗證都一一失敗了,有一些經驗和教訓在這裡分享下. 之所以是尷尬,是最後因為偶爾出現修復了另一個問題導致記憶體不再上升,但這之間的關係還未明瞭,還需要繼續追蹤. 這裡講述一下這次排查的過程. 直接記憶體的錯誤判斷 伺服器的JVM配