当前位置: 代码迷 >> Eclipse >> MyEclipse Profile 组合visualvm 监控内存泄露
  详细解决方案

MyEclipse Profile 组合visualvm 监控内存泄露

热度:792   发布时间:2016-04-23 12:10:14.0
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[]右键菜单选择【生成快照并显示栈分配跟踪】。能够快速定位在什么地方消耗比较大的内存,能够快速解决问题:



参考资料:VisualVM远程监控
1 楼 ayufox 2010-07-06  
VisualVM对Memory和Performance的剖析是上不了台面滴,只支持本地的剖析,基本上宣判没多大用途。另外有一个Profile插件,支持远程剖析,但是是基于采样(Sample)的,不准还别说,对性能还特别影响。我觉得基本上VisualVM没有什么亮点,一些好用的功能JConsole都有,而JConsole没有的功能又都比较失败。对内存剖析基本上jmap+Eclipse Memory Analyzer是王道,而对性能的剖析目前还没有看到特别棒的产品,JProfiler和TPTP对性能的trade-off都特别厉害
2 楼 GuolinLee 2012-02-03  
正想了解这方面的东西,研究一下这个工具先
  相关解决方案