MyEclipse Profile 结合visualvm 监控内存泄露

来源:互联网 发布:大汉天子百度云源码 编辑:程序博客网 时间:2024/05/04 12:35
 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代码 复制代码 收藏代码
  1. public class MemoryLeak {   
  2.   
  3.     public static void main(String[] args) throws InterruptedException {   
  4.   
  5.         int MAX_CONSUMERS = 10000;   
  6.         int SLEEP_BETWEEN_ALLOCS = 5;   
  7.   
  8.         ConsumerContainer objectHolder = new ConsumerContainer();   
  9.   
  10.         while (objectHolder.size() < MAX_CONSUMERS) {   
  11.             System.out.println("Allocating object "  
  12.                     + Integer.toString(objectHolder.size()));   
  13.             objectHolder.add(new MemoryConsumer());   
  14.             try {   
  15.                 Thread.currentThread().sleep(SLEEP_BETWEEN_ALLOCS);   
  16.             } catch (InterruptedException ie) {   
  17.                 // Do nothing.   
  18.             }   
  19.         } // while.   
  20.   
  21.         Thread.sleep(1000*60*60);   
  22.     } // main.   
  23.   
  24. // End of MemoryLeak.   
  25.   
  26. class ConsumerContainer extends Vector {   
  27. }   
  28.   
  29. class MemoryConsumer {   
  30.     public static final int MEMORY_BLOCK = 1024;   
  31.     public byte[] memoryHoldingArray;   
  32.   
  33.     MemoryConsumer() {   
  34.         memoryHoldingArray = new byte[MEMORY_BLOCK];   
  35.     }   
  36. // End MemoryConsumer.  


2:在MemoryLeak.java右键菜单选择【Profile As】->【Java Application】,在弹出如下窗口,选择【memory】.

3:程序开始启动运行,同时弹出visualvm窗口,如下图,【profile】tab可以看到对象大小比例。【监控】可以看到对的运行走向。

4:可以发现byte数组暂用比较大。在byte[]右键菜单选择【生成快照并显示栈分配跟踪】。能够快速定位在什么地方消耗比较大的内存,能够快速解决问题:



参考资料:VisualVM远程监控
0 0