使用EclipseMemoryAnalyzer進行內存佔用分析

問題描述:

一、發現線上應用在重啓運行兩小時後,每一個應用的內存達到10G。10G是應用配置參數JVM的-Xmx值。打開jvisualvm工具,java自帶的可視化監控文件通常是C:Program Files (x86)Javajdk1.6.0_26injvisualvm.exe。如圖堆大小達到設置的最大值10G。html

使用EclipseMemoryAnalyzer進行內存佔用分析

問題處理過程:

一、分析最近升級的代碼是否有問題,在Eclipse中,右鍵工程名,選擇Team-Show In History,對比分析最近6周修改的代碼,沒有發現可能致使內存增大的代碼。java

使用EclipseMemoryAnalyzer進行內存佔用分析

二、使用Eclipse Memory Analyzer進行內存佔用分析。MAT是一個基於Eclipse的內存分析工具,是一個快速、功能豐富的JAVA heap分析工具,它能夠幫助咱們查找內存泄漏和減小內存消耗。在jvisualvm工具右上角,點擊「堆 Dump」會生成當前內存的堆棧信息到應用服務器/tmp目錄下,把此文件下載到本地導入到MAT中進行分析。MAT默認分配的內存爲1G,當堆棧文件大於1G時很難打開,所以修改啓動文件中的MemoryAnalyzer.ini,改成-Xmx15240m。服務器

三、CustomThreadPoolExecutor1這個線程池的一個實例達到8.4G。工具

使用EclipseMemoryAnalyzer進行內存佔用分析

四、點擊Histogram柱狀圖,列出了每一個類產生的實例數量,以及所佔用的內存大小和百分比。Shallow Size 表示對象自身佔用的內存大小,不包括它引用的對象。Retained Size 表示當前對象大小+當前對象可直接或間接引用到的對象的大小總和(間接引用的含義:A->B->C, C就是間接引用) 。spa

使用EclipseMemoryAnalyzer進行內存佔用分析

五、右鍵選擇佔用內存最大的一行記錄,Merge Shortest Paths to GC roots -> exclude all phantom/weak/soft etc.reference(排除全部虛弱軟引用) →查看剩餘未被回收的強引用對象佔用緣由。.net

使用EclipseMemoryAnalyzer進行內存佔用分析

六、如圖所示,是一個List達到23000的長度佔用了8G內存。分析PdfPTable中的PdfPRow中的PdfPCell,找到出問題的數據,分析每一個PdfPTable有52個行PdfPRow,說明是打印帳頁數據。查詢正在執行的任務,推斷是打印帳頁時頁數太多致使內存迅速增大。線程

使用EclipseMemoryAnalyzer進行內存佔用分析

七、通過查找,定位到以下代碼,pdfTableList雖然是局部變量,可是佔用了內存。所以改成每生成一頁Pdf,就添加到pdfDocument中,再也不使用pdfTableList過渡。code

//原代碼
pdfDocument.open();
for(PdfPTable table : pdfTableList){
    pdfDocument.newPage();
    pdfDocument.add(table);
}
pdfDocument.close();複製代碼

八、升級程序,自動任務再次運行完成後,生成兩個5w頁的PDF,每一個240M,沒有內存增大,說明修改生效。
cdn


參考資料:htm

一、blog.csdn.net/u012550080/…

二、www.javatang.com/archives/20…

三、www.jianshu.com/p/82b25cf8c…

相關文章
相關標籤/搜索