Java内存泄露测试及工具
声明:这是转载的。
测试类:
Element.java
- package com.memoryleak.demo;
- public class Element {
- private byte[] data;
- public Element(int size){
- this.data = new byte[size];
- }
- }
LeakStack.java
- package com.memoryleak.demo;
- import java.util.EmptyStackException;
- /**
- * Demo: 存在内存泄露的堆栈
- *
- */
- public class LeakStack {
- private Object[] stack;
- private int top = -1;
- public LeakStack(int initialCapicity){
- stack = new Object[initialCapicity];
- }
- public void push(Object e){
- ensureCapacity();
- top++;
- stack[top] = e;
- }
- public Object pop(){
- if(top == -1)
- throw new EmptyStackException();
- Object temp = stack[top];
- // stack[top] = null;
- top--;
- return temp;
- }
- /**
- * 判断是否栈满,如果栈满则自动扩充
- */
- public void ensureCapacity(){
- if(stack.length == top + 1){
- Object[] temp = stack;
- stack = new Object[2 * stack.length + 1];
- System.arraycopy(temp, 0, stack, 0, top);
- }
- }
- }
测试主方法类:
- package com.memoryleak.demo;
- import java.util.EmptyStackException;
- public class AppTest {
- public static void main(String[] args) {
- try{
- int round = 1000;
- LeakStack s = new LeakStack(2000);
- for(int i=0; i<2; i++){
- System.out.println("push " + i);
- for(int j=0; j<round; j++){
- s.push(new Element(65000));
- }
- System.out.println("pop " + i);
- for(int m=0; m<round; m++)
- s.pop();
- }
- }catch (EmptyStackException e) {
- // TODO: handle exception
- e.printStackTrace();
- }
- }
- }
使用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内存泄露测试及工具的更多相关文章
- CPP-基础:内存泄露及其检测工具
[转]浅谈C/C++内存泄露及其检测工具 对于一个c/c++程序员来说,内存泄漏是一个常见的也是令人头疼的问题.已经有许多技术被研究出来以应对这个问题,比如 Smart Pointer,Garba ...
- Visual C++内存泄露检测—VLD工具使用说明[转]
Visual C++内存泄露检测—VLD工具使用说明 一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...
- Java内存泄露监控工具:JVM监控工具介绍【转】
jstack?-- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程 ...
- 【VS开发】Visual C++内存泄露检测—VLD工具使用说明
Visual C++内存泄露检测-VLD工具使用说明 一. VLD工具概述 Visual Leak Detector(VLD)是一款用于Visual C++的免费的内存泄露检测工具.他的 ...
- java内存泄露与内存溢出
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory: 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空 ...
- java内存泄露的理解与解决(转)
Java内存管理机制 在C++语言中,如果需要动态分配一块内存,程序员需要负责这块内存的整个生命周期.从申请分配.到使用.再到最后的释放.这样的过程非常灵活,但是却十分繁琐,程序员很容易由于疏忽而忘记 ...
- Java内存泄露的原因
Java内存泄露的原因 1.静态集合类像HashMap.Vector等的使用最容易出现内存泄露,这些静态变量的生命周期和应用程序一致,所有的对象Object也不能被释放,因为他们也将一直被Vector ...
- Java 内存泄露
一.Java内存回收机制 不论哪种语言的内存分配方式,都需要返回所分配内存的真实地址,也就是返回一个指针到内存块的首地址.Java中对象是采用new或者反射的方法创建的,这些对象的创建都是在堆(Hea ...
- Java 内存泄露的理解与解决过程
本文详细地介绍了Java内存管理的原理,以及内存泄露产生的原因,同时提供了一些列解决Java内存泄露的方案,希望对各位Java开发者有所帮助. Java内存管理机制 在C++ 语言中,如果需要动态分配 ...
- Visual Studio内存泄露检測工具
使用简单介绍 在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...
随机推荐
- c++学习笔记(五):文件操作
目录 文件操作 文本文件 写文件 include 读文件 include 二进制文件 写文件 读文件 文件操作 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 通过文件可以将数据持久化 ...
- Charles的https抓包方法及原理/下载ssl/http证书【转】
Charles的https抓包方法及原理/下载ssl/http证书 本文的Charles,适应windows/MAC/IOS/Android,避免抓包HTTPS失败和乱码: charles如果不配 ...
- 6.12Web应用漏洞发现探针利用
已知CMS.开发框架. 思路: 各个页面查看数据包(地址信息),查看框架,上fofa关键字搜索(查看其框架信息如thinkhphp),利用检测工具测试漏洞情况: 网站根目录下的robots.txt文件 ...
- CSIG青年科学家会议圆满举行,合合信息打造智能文档处理融合研究新范式
近期,第十九届中国图象图形学学会青年科学家会议(简称"会议")在广州召开.会议由中国图象图形学学会(CSIG)主办,琶洲实验室.华南理工大学.中山大学.中国图象图形学学 ...
- Angular 18+ 高级教程 – Component 组件 の Pipe 管道
介绍 Pipe 类似于 Template Syntax,它的用途是 transform value for display. 参考: Docs – Understanding Pipes DatePi ...
- [TK] CF1526B I Hate 1111
给定一个数,将它表示成若干个形如 \(11,111,1111\cdots\) 之类的数之和,判断有没有可行解 考虑到一种贪心,即从高位开始依次向下减去每位数字,判断还能不能减动,减不动或者没减完就报告 ...
- 基于SqlAlchemy+Pydantic+FastApi的Python开发框架的路由处理
在前面随笔<基于SqlAlchemy+Pydantic+FastApi的Python开发框架>中介绍了框架总体的内容,其中主要的理念就是通过抽象接口的方式,实现代码的重用,提高开发效率.本 ...
- Windows安装Powershell7.x
事件起因: 由于需要运行一个脚本,但是该脚本是广大网友群众使用Powershell7写的,我自带的是Powershell5,运行过程中总是出现莫名其妙的问题,于是决定将Powershell升级到Pow ...
- 4.3 等比数列及其前n项和
\(\mathbf{{\large {\color{Red} {欢迎到学科网下载资料学习}} } }\)[[高分突破系列] 高二数学下学期同步知识点剖析精品讲义! \(\mathbf{{\large ...
- vue前端使用nexus配置npm私有仓库
当我们运行前端项目的时候,常常在解决依赖的时候会加上一个参数npm install --registry=https://registry.npm.taobao.org将源指定为淘宝的源,以期让速度加 ...