MyEclipse Profile 结合visualvm 监控内存泄露
生活随笔
收集整理的這篇文章主要介紹了
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,寫一個消耗內存的測試代碼:
Java代碼 ?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.??
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[]右鍵菜單選擇【生成快照并顯示棧分配跟蹤】。能夠快速定位在什么地方消耗比較大的內存,能夠快速解決問題:
參考資料: VisualVM遠程監控
??? 1:創建java工程VisualvmTest,寫一個消耗內存的測試代碼:
Java代碼 ?
2:在MemoryLeak.java右鍵菜單選擇【Profile As】->【Java Application】,在彈出如下窗口,選擇【memory】.
3:程序開始啟動運行,同時彈出visualvm窗口,如下圖,【profile】tab可以看到對象大小比例。【監控】可以看到對的運行走向。
4:可以發現byte數組暫用比較大。在byte[]右鍵菜單選擇【生成快照并顯示棧分配跟蹤】。能夠快速定位在什么地方消耗比較大的內存,能夠快速解決問題:
參考資料: VisualVM遠程監控
總結
以上是生活随笔為你收集整理的MyEclipse Profile 结合visualvm 监控内存泄露的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 超级问题排查
- 下一篇: Aix iostat命令解析