MyEclipse Profile 結合visualvm 監控內存泄露

VisualVM是集成了多個JDK命令工具的一個可視化工具,它主要用來監控JVM的運行情況,可以用它來查看和瀏覽Heap Dump、Thread Dump、內存對象實例情況、GC執行情況、CPU消耗以及類的裝載情況。在JDK Update7之後,VisualVM作爲JDK的一部分發布,但同時VisualVM也發佈獨立的版本。VisualVM必須運行在JDK1.6以上的VM環境下,但可以用它來監控JDK1.4以上的JVM。 

1:創建java工程VisualvmTest,寫一個消耗內存的測試代碼: 

public class MemoryLeak {

	public static void main(String[] args) throws InterruptedException {

		int MAX_CONSUMERS = 10000;
		int SLEEP_BETWEEN_ALLOCS = 5;

		ConsumerContainer objectHolder = new ConsumerContainer();

		while (objectHolder.size() < MAX_CONSUMERS) {
			System.out.println("Allocating object "
					+ Integer.toString(objectHolder.size()));
			objectHolder.add(new MemoryConsumer());
			try {
				Thread.currentThread().sleep(SLEEP_BETWEEN_ALLOCS);
			} catch (InterruptedException ie) {
				// Do nothing.
			}
		} // while.

		Thread.sleep(1000*60*60);
	} // main.

} // End of MemoryLeak.

class ConsumerContainer extends Vector {
}

class MemoryConsumer {
	public static final int MEMORY_BLOCK = 1024;
	public byte[] memoryHoldingArray;

	MemoryConsumer() {
		memoryHoldingArray = new byte[MEMORY_BLOCK];
	}
} // End MemoryConsumer.

2:在MemoryLeak.java右鍵菜單選擇【Profile As】->【Java Application】,在彈出如下窗口,選擇【memory】.


3:程序開始啓動運行,同時彈出visualvm窗口,如下圖,【profile】tab可以看到對象大小比例。【監控】可以看到對的運行走向。 


4:可以發現byte數組暫用比較大。在byte[]右鍵菜單選擇【生成快照並顯示棧分配跟蹤】。能夠快速定位在什麼地方消耗比較大的內存,能夠快速解決問題:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章