new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool
閱讀文本大概需要3分鐘。
一個大型的Java項目也許從開發到測試結束并可能不能未發現一些重大的問題,但是在生產環境中還是會出現一些非常棘手的問題,如內存泄漏直接導致服務宕機,遇到這樣的問題對于一個經驗尚淺的開發人員來說難度非常大,好的一點是JVM 能夠記錄下問題發生時系統的部分運行狀態,并將其存儲在堆轉儲 (Heap Dump) 文件中,從而為我們分析和診斷問題提供了重要的依據。要生存Heap Dump文件的前提是需要在服務的啟動腳本添加一些jvm參數。
接下來將講解如何生產Heap Dump文件到如何使用Memory Analyzer Tool分析Heap Dump文件。Memory Analyzer Tool是一款“傻瓜式“的堆轉儲文件分析工具,通過該工具可以生成一個專業的分析報告,從而準確的定位到問題的所在位置。
1、安裝 Memory Analyzer Tool
方式一:直接從官網下載程序包 http://www.eclipse.org/mat/downloads.php,解壓可直接使用。
方式二:在Eclipse中通過 Help -> Install New Software,輸入地址 http://download.eclipse.org/mat/1.9.0/update-site/進行安裝
方式三:Eclipse 的可插拔式插件安裝方式
2、配置環境參數
為了更有效率的使用Memory Analyzer Tool,還需要做一些配置工作。因為通常而言,分析一個堆轉儲文件需要消耗很多的堆空間,為了保證分析的效率和性能,在有條件的情況下,建議分配給 Memory Analyzer?Tool盡可能多的內存資源。可以采用如下兩種方式來分配內存更多的內存資源給 Memory Analyzer?Tool 。
方式一:修改啟動參數 MemoryAnalyzer.exe -vmargs -Xmx4g
方式二:編輯文件 MemoryAnalyzer.ini,在里面添加類似信息 -vmargs – Xmx4g
3、如何獲得堆轉儲文件
方式一:在Eclipse中配置JVM啟動參數 -XX:+HeapDumpOnOutOfMemoryError
方式二:通過JDK自帶的工具jmap,jconsole來獲得一個堆轉儲文件
這里使用方式一來獲得
Java中OutOfMemoryError(內存溢出)的三種情況及解決辦法
在解決java內存溢出問題之前,需要對jvm(java虛擬機)的內存管理有一定的認識。jvm管理的內存大致包括三種不同類型的內存區域:PermanentGeneration space(永久保存區域)、Heap space(堆區域)、JavaStacks(Java棧)。其中永久保存區域主要存放Class(類)和Meta的信息,Class第一次被Load的時候被放入PermGenspace區域,Class需要存儲的內容主要包括方法和靜態屬性。堆區域用來存放Class的實例(即對象),對象需要存儲的內容主要是非靜態屬性。每次用new創建一個對象實例后,對象實例存儲在堆區域中,這部分空間也被jvm的垃圾回收機制管理。而Java棧跟大多數編程語言包括匯編語言的棧功能相似,主要基本類型變量以及方法的輸入輸出參數。Java程序的每個線程中都有一個獨立的堆棧。容易發生內存溢出問題的內存空間包括:PermanentGeneration space和Heap space。
第一種OutOfMemoryError:PermGenspace
發生這種問題的原意是程序中使用了大量的jar或class,使java虛擬機裝載類的空間不夠,與PermanentGeneration space有關。解決這類問題有以下兩種辦法:
1、增加java虛擬機中的XX:PermSize和XX:MaxPermSize參數的大小,其中XX:PermSize是初始永久保存區域大小,XX:MaxPermSize是最大永久保存區域大小。如針對tomcat,在catalina.sh或catalina.bat文件中一系列環境變量名說明結束處(大約在70行左右) 增加一行:
JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"
第二種OutOfMemoryError:Java heap space
發生這種問題的原因是java虛擬機創建的對象太多,在進行垃圾回收之間,虛擬機分配的到堆內存空間已經用滿了,與Heapspace有關。解決這類問題有兩種思路:
1、檢查程序,看是否有死循環或不必要地重復創建大量對象。找到原因后,修改程序和算法。
2、增加Java虛擬機中Xms(初始堆大小)和Xmx(最大堆大小)參數的大小。如:set JAVA_OPTS= -Xms256m-Xmx1024m
第三種OutOfMemoryError:unable to create new nativethread
這種錯誤在Java線程個數很多的情況下容易發生
4、實例分析編寫例子獲取Heap?Dump文件
import?java.util.ArrayList;import?java.util.List;
public?class?HeapDumpMain?{
????static?class?OOMHeapDumpObject{
????????String?str?="1234567890";
????}
????public?static?void?main(String[]?args)?{
????????List?ooms?=?new?ArrayList();
????????while?(true)?{
????????????ooms.add(new?OOMHeapDumpObject());
????????}
????}
}
Eclipse中VM參數配置如下
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
運行示例代碼即可生成Heap?Dump文件
一般在項目的當目前目錄下
運行Memory Analyzer?Tool(個人比較喜歡獨立運行的Memory Analyzer?Tool)
報告分析
內存使用整體情況
直接點擊下方的 Reports->Leak Suspects 鏈接來生成報告,查看導致內存泄露的罪魁禍首
從圖上可以清晰地看到一個可疑對象消耗了系統近 98% 的內存。再往下看餅圖下方文字簡短描述了大量的內存是由屬于Object實例的對象所消耗的,system class loader 負責加載這個對象。也許從這里還不能找出內存泄漏的具體原因,接著往下看。點擊下圖標志的地方
可以看到如下
備注:
Shallow Heap 為對象自身占用的內存大小,不包括它引用的對象。
Retained Heap 為當前對象大小 + 當前對象可直接或間接引用到的對象的大小總和
在這張圖上可以清楚的看到,這個對象集合中保存了大量 OOMHeapDumpObject 對象的引用,就是它導致的內存泄露。這時就需要排查程序中為什么會創建這么多OOMHeapDumpObject?對象,然后解決問題。
參考:
https://www.jianshu.com/p/fc0e9e0a3ef2https://my.oschina.net/feinik/blog/874023#comments
☆
往期精彩
☆
01?漫談發版哪些事,好課程推薦
02?Linux的常用最危險的命令
03?互聯網支付系統整體架構詳解
04?優秀的Java程序員必須了解的GC哪些
05?IT大企業有哪些病,別被這些病毀了自己?
關注我每天進步一點點
你點的每個在看,我都認真當成了喜歡
總結
以上是生活随笔為你收集整理的new arraylist内存_Java内存泄漏分析工具Memory Analyzer Tool的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spss process插件_SPSS教
- 下一篇: pycharm导入python环境是空的