使用Eclipse Memory Analyzer分析Tomcat內存溢出


前言

在平時開發、測試過程中、甚至是生產環境中,有時會遇到OutOfMemoryError,Java堆溢出了,這表明程序有嚴重的問題。我們需要找造成OutOfMemoryError原因。一般有兩種情況:

1、內存泄露,對象已經死了,無法通過垃圾收集器進行自動回收,通過找出泄露的代碼位置和原因,才好確定解決方案;
2、內存溢出,內存中的對象都還必須存活着,這說明Java堆分配空間不足,檢查堆設置大小(-Xmx與-Xms),檢查代碼是否存在對象生命周期太長、持有狀態時間過長的情況。
以上是處理Java堆問題的思路,具體是怎么進行分析,這里介紹的是使用Eclipse Memory Analyzer tool(MAT)工具分析的過程。
 

1.MAT安裝與介紹
     下載地址:http://www.eclipse.org/mat/downloads.php。
或  在 eclipse ->install new software -> http://download.eclipse.org/mat/1.6/update-site/ 進行安裝

2.配置JVM 
     通過jvm參數--XX:-HeapDumpOnOutOfMemoryError可以讓JVM在出現內存溢出是Dump出當前的內存轉儲快照;
  我的配置是:-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
附加:動態看見eclipse運行內存
 
 
3.編寫測試代碼
public class Test {
	static class OOMObject {
		
	}
	public static void main(String[] args) {
		List<OOMObject> list = new ArrayList<OOMObject>();
		while(true){
			list.add(new OOMObject());
		}
	}
}

運行結果如下

 

java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid2277.hprof ...
Heap dump file created [27929324 bytes in 0.137 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:3210)
	at java.util.Arrays.copyOf(Arrays.java:3181)
	at java.util.ArrayList.grow(ArrayList.java:261)
	at java.util.ArrayList.ensureExplicitCapacity(ArrayList.java:235)
	at java.util.ArrayList.ensureCapacityInternal(ArrayList.java:227)
	at java.util.ArrayList.add(ArrayList.java:458)
	at com.b2b.console.Test.main(Test.java:13)

 

刷新項目target目錄

雙擊文件打開:

 
     
     從上圖可以看到它的大部分功能。
     1. Histogram可以列出內存中的對象,對象的個數以及大小。
     2. Dominator Tree可以列出那個線程,以及線程下面的那些對象占用的空間。
     3.Top consumers通過圖形列出最大的object。
     4.Leak Suspects通過MA自動分析泄漏的原因。
     
     Histogram如下圖:
     Objects:類的對象的數量。
     Shallow size:就是對象本身占用內存的大小,不包含對其他對象的引用,也就是對象頭加成員變量(不是成員變量的值)的總和。
     Retained size:是該對象自己的shallow size,加上從該對象能直接或間接訪問到對象的shallow size之和。換句話說,retained size是該對象被GC之后所能回收到內存的總和。



 
 
可見,類Test中OOMObject內存溢出.
 
 
以上是通過MAT分析Tomcat應用程序,找到內存泄露的原因。

 參考文章: http://blog.csdn.net/xb151652000/article/details/8056792


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM