声明:这是转载的。

测试类:

Element.java

  1. package com.memoryleak.demo;
  2. public class Element {
  3. private byte[] data;
  4. public Element(int size){
  5. this.data = new byte[size];
  6. }
  7. }

LeakStack.java

  1. package com.memoryleak.demo;
  2. import java.util.EmptyStackException;
  3. /**
  4. * Demo: 存在内存泄露的堆栈
  5. *
  6. */
  7. public class LeakStack {
  8. private Object[] stack;
  9. private int top = -1;
  10. public LeakStack(int initialCapicity){
  11. stack = new Object[initialCapicity];
  12. }
  13. public void push(Object e){
  14. ensureCapacity();
  15. top++;
  16. stack[top] = e;
  17. }
  18. public Object pop(){
  19. if(top == -1)
  20. throw new EmptyStackException();
  21. Object temp = stack[top];
  22. //      stack[top] = null;
  23. top--;
  24. return temp;
  25. }
  26. /**
  27. * 判断是否栈满,如果栈满则自动扩充
  28. */
  29. public void ensureCapacity(){
  30. if(stack.length == top + 1){
  31. Object[] temp = stack;
  32. stack = new Object[2 * stack.length + 1];
  33. System.arraycopy(temp, 0, stack, 0, top);
  34. }
  35. }
  36. }

测试主方法类:

  1. package com.memoryleak.demo;
  2. import java.util.EmptyStackException;
  3. public class AppTest {
  4. public static void main(String[] args) {
  5. try{
  6. int round = 1000;
  7. LeakStack s = new LeakStack(2000);
  8. for(int i=0; i<2; i++){
  9. System.out.println("push " + i);
  10. for(int j=0; j<round; j++){
  11. s.push(new Element(65000));
  12. }
  13. System.out.println("pop " + i);
  14. for(int m=0; m<round; m++)
  15. s.pop();
  16. }
  17. }catch (EmptyStackException e) {
  18. // TODO: handle exception
  19. e.printStackTrace();
  20. }
  21. }
  22. }

使用jdk自带工具hprof

用JVM的-Xrunhprof选项可以打开hprof工具

java -Xrunhprof:heap=sites,file=log.txt com.memoryleak.demo.AppTest

Eclipse中的参数配置

打开log.txt文件

live表示活跃的,allocate表示已分配的;

从上往下占用内存降序排列,排在第一位的占用内存最多,为130032000byte 约130m,占内存总量的99.75%

objs 表示对象的个数

从图上看活跃的1032个对象,总共分配了2000个对象。在这里如果发生内存泄露 OutOfMemoryError时

活跃数就和分配数相差无几。

可根据末尾的trace name 找到更详细的trace说明,作进一步的判断

排第一的300209,可以找到相关的类是Element,也就是说Element对象没有得到及时的回收。

有一个被广泛使用的工具是JRockit,现在貌似是免费的了

http://hi.baidu.com/shiliangshuai/item/852d5b3546e735d56c15e95a

使用JRockit作为工具检测并解决JAVA内存泄漏问题的一次实战

这篇文章介绍的不错,可以参考


Java内存泄露测试及工具的更多相关文章

  1. CPP-基础:内存泄露及其检测工具

    [转]浅谈C/C++内存泄露及其检测工具   对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garba ...

  2. Visual C++内存泄露检测—VLD工具使用说明[转]

    Visual C++内存泄露检测—VLD工具使用说明 一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...

  3. Java内存泄露监控工具:JVM监控工具介绍【转】

    jstack?-- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程 ...

  4. 【VS开发】Visual C++内存泄露检测—VLD工具使用说明

    Visual C++内存泄露检测-VLD工具使用说明 一.        VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...

  5. java内存泄露与内存溢出

    内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory: 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空 ...

  6. java内存泄露的理解与解决(转)

    Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...

  7. Java内存泄露的原因

    Java内存泄露的原因 1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector ...

  8. Java 内存泄露

    一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Hea ...

  9. Java 内存泄露的理解与解决过程

    本文详细地介绍了Java内存管理的原理,以及内存泄露产生的原因,同时提供了一些列解决Java内存泄露的方案,希望对各位Java开发者有所帮助. Java内存管理机制 在C++ 语言中,如果需要动态分配 ...

  10. Visual Studio内存泄露检測工具

    使用简单介绍     在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...

随机推荐

  1. C语言指针的作业

    指针的作业 求Sn = a + aa + aaa + aaaa + aaaaa的前五项和,其中a是一个数字. 例如:2 + 22 + 222 + 2222 + 22222 /* 求Sn = a + a ...

  2. A星搜索算法的更多细节

    A*搜索算法的更多内容 A*算法,也许你会习惯称它为「A*寻路算法」.许多人大概是因寻路--尤其是「网格地图」寻路认识它的,网上很多教程也是以网格地图为例讲解它的算法实现.这导致了许多人在遇到同样用了 ...

  3. 小tips:...运算符(展开运算符、剩余操作符)

    如下例子: 1. var set = new Set([1, 2, 3, 4, 4,4,4,4,2,2,2]) set=[...set] 2. let [head, ...tail] = [1, 2, ...

  4. 小tips:前端容易读错的单词列表

    排名第一的是width,音标/wɪdθ/,发/i/的音,不是发/ai/的音: hidden音标/ˈhɪdn/发/i/的音,不是发/ai/的音: hide音标/haɪd/,发/ai/的音: float音 ...

  5. JavaScript – 类型转换

    介绍 JS 是弱类型语言, 在编程时, 有许多自动类型转换的技巧, 虽然大家都不太鼓励, 尤其是用了 TypeScript 之后, 但无可否认自动转换很方便, 看上去也很干净. 所以这篇还是要介绍一些 ...

  6. Wpf使用NLog将日志输出到LogViewer

    1 LogViewer LogViewer是通过UDP传输的高性能实时log查看器. 具有一下特性: 通过UDP读取日志 通过文件导入日志 导出日志到一个文件中 排序.过滤(日志树,日志等级)和查找 ...

  7. vsphere8.0 VCenter部署

    一.vCenter Server 介绍 vCenter Server是VMware提供的一种集中管理平台,用于管理和监控虚拟化环境中的虚拟机.主机.存储和网络等资源.它提供了一套功能强大的工具和界面, ...

  8. composer 执行脚本时报错:Error: You made a reference to a non-existent script @php artisan package:discover

    composer 执行脚本时报错:Error: You made a reference to a non-existent script @php artisan package:discover. ...

  9. Android :安卓学习笔记之 Handler机制 的简单理解和使用

    目录 Handler机制 1.Handler使用的引出 2.背景和定义 3.作用和意义 4.主要参数 5.工作原理及流程 5.1.对应关系 6.深入分析 Handler机制源码 6.1.Handler ...

  10. jenkins Publish over SSH 的配置与使用

    一.安装Publish over SSH 插件 二.在Configure System 配置Publish over SSH属性 Passphrase:如果私钥设置了密码就是私钥的密码,私钥没设置密码 ...