MyEclipse Profile 结合visualvm 监控内存泄露
生活随笔
收集整理的這篇文章主要介紹了
MyEclipse Profile 结合visualvm 监控内存泄露
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
VisualVM是集成了多個(gè)JDK命令工具的一個(gè)可視化工具,它主要用來(lái)監(jiān)控JVM的運(yùn)行情況,可以用它來(lái)查看和瀏覽Heap Dump、Thread Dump、內(nèi)存對(duì)象實(shí)例情況、GC執(zhí)行情況、CPU消耗以及類的裝載情況。在JDK Update7之后,VisualVM作為JDK的一部分發(fā)布,但同時(shí)VisualVM也發(fā)布獨(dú)立的版本。VisualVM必須運(yùn)行在JDK1.6以上的VM環(huán)境下,但可以用它來(lái)監(jiān)控JDK1.4以上的JVM。
??? 1:創(chuàng)建java工程VisualvmTest,寫(xiě)一個(gè)消耗內(nèi)存的測(cè)試代碼:
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:程序開(kāi)始啟動(dòng)運(yùn)行,同時(shí)彈出visualvm窗口,如下圖,【profile】tab可以看到對(duì)象大小比例?!颈O(jiān)控】可以看到對(duì)的運(yùn)行走向。
4:可以發(fā)現(xiàn)byte數(shù)組暫用比較大。在byte[]右鍵菜單選擇【生成快照并顯示棧分配跟蹤】。能夠快速定位在什么地方消耗比較大的內(nèi)存,能夠快速解決問(wèn)題:
參考資料: VisualVM遠(yuǎn)程監(jiān)控
??? 1:創(chuàng)建java工程VisualvmTest,寫(xiě)一個(gè)消耗內(nèi)存的測(cè)試代碼:
Java代碼 ?
2:在MemoryLeak.java右鍵菜單選擇【Profile As】->【Java Application】,在彈出如下窗口,選擇【memory】.
3:程序開(kāi)始啟動(dòng)運(yùn)行,同時(shí)彈出visualvm窗口,如下圖,【profile】tab可以看到對(duì)象大小比例?!颈O(jiān)控】可以看到對(duì)的運(yùn)行走向。
4:可以發(fā)現(xiàn)byte數(shù)組暫用比較大。在byte[]右鍵菜單選擇【生成快照并顯示棧分配跟蹤】。能夠快速定位在什么地方消耗比較大的內(nèi)存,能夠快速解決問(wèn)題:
參考資料: VisualVM遠(yuǎn)程監(jiān)控
總結(jié)
以上是生活随笔為你收集整理的MyEclipse Profile 结合visualvm 监控内存泄露的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 超级问题排查
- 下一篇: Aix iostat命令解析