声明:这是转载的。

测试类:

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. 【YashanDB数据库】YashanDB如何回收表空间

    确认表空间高水位线,是否有可回收空间. select a.tablespace_name,a.high_water_mark,b.user_bytes,b.total_bytes from (SELE ...

  2. Goby 漏洞发布|(CVE-2024-45195)Apache OFBiz /viewdatafile 代码执行漏洞【已复现】

    漏洞名称:Apache OFBiz /viewdatafile 代码执行漏洞(CVE-2024-45195) English Name:Apache OFBiz /viewdatafile Code ...

  3. CSS – Houdini

    介绍 简单说这个 Houdini 是一系列 CSS 底层 API,它可以让我们扩展 CSS,做出一些 Polyfill. 举一个例子,让大家有个画面. 我们可以通过 CSS + JS + Canvas ...

  4. OData – Custom Serialize & Deserialize

    前言 本来计划用 Custom Serialize 来解决 OData 不支持 [JsonPropertyName] 的问题. 但是后来发现 Custom Serialize 并不能解决这个问题. C ...

  5. GPT最佳实践:五分钟打造你自己的GPT

    前几天OpenAI的My GPTs栏目还是灰色的,就在今天已经开放使用了.有幸第一时间体验了一把生成自己的GPT,效果着实惊艳!!!我打造的GPT模型我会放到文章末尾,大家感兴趣也可以自己体验一下. ...

  6. 【学习笔记】数位DP

    数位DP 适用条件 此类题目一般要求在\([l,r]\)区间内满足条件的数的个数,答案一般与数的大小无关,而与数各位的组成有关.题目中给出的数的范围一般较大,往往在\(10^9\)以上因此无法暴力枚举 ...

  7. 官方 | 征集 Flutter 桌面端应用程序的构建案例

    亲爱的社区成员们,大家好! Google Flutter 团队希望了解开发者们使用 Flutter 构建的桌面端应用程序,以提高 Flutter 桌面端的测试覆盖率,邀请大家通过表单的形式提交征集和反 ...

  8. Atcoder Beginner Contest 367

    A.Shout Everyday \(\text{Diff }43\) 给你 \(24\) 小时制下的 \(A,B,C\) 三个时刻,问 \(A\) 是否在 \([B,C]\) 范围内 考虑到先将 \ ...

  9. 一次基于AST的大规模代码迁移实践

    作者:来自 vivo 互联网大前端团队- Wei Xing 在研发项目过程中,我们经常会遇到技术架构迭代更新的需求,通过技术的迭代更新,让项目从新的技术特性中受益,但由于很多新的技术迭代版本并不能完全 ...

  10. Windows 10 LTSC 2019(1809) WSL 安装 CentOS 7

    1.安装WSL    通过控制面板--程序和功能--启用或关闭WIndows功能,勾选"适用于Linux的Windows子系统".    或者通过管理员权限打开 PowerShel ...