`
strongkill
  • 浏览: 8581 次
  • 来自: 广东
文章分类
社区版块
存档分类
最新评论

利用dump heap找出内存泄漏。

阅读更多
  今日在resin的dump heap中发现大量的char[]和byte[]对象:

引用

1.0000 112.922M 7.613M 105.309M 166308 java.util.HashMap
0.8115 97.763M 97.763M 0.000M 483874 char[]
0.7928 89.842M 89.842M 0.000M 15243 byte[]

0.7869 88.862M 16.175M 72.687M 706694 java.util.HashMap$Entry
0.5190 58.608M 11.225M 47.382M 490447 java.lang.String
0.3688 41.640M 9.187M 32.453M 170271 java.util.HashMap$Entry[]
0.2521 28.465M 0.021M 28.444M 455 com.caucho.db.store.ReadBlock


  加起来竟然有200M之大,马上就想起了一个低层的截字符串的函数使用了byte[]和char[],而且使用率非常频繁,平均每个页面都会调用100-150次左右。

	public static String subContentStringOrial(String str, int targetCount,String more)
	{
		if (str == null)
			return "";
		int initVariable = 0;
		StringBuffer restr = new StringBuffer();
		if (str.length() <= targetCount)
			return str;
		String s1=null;
		byte[] b;
		char[] tempchar = str.toCharArray();
		for (int i = 0; (i < tempchar.length && targetCount > initVariable); i++) {
			s1 = String.valueOf(tempchar[i]);
			b = s1.getBytes();
			initVariable += b.length;
			restr.append(tempchar[i]);
		}
		if (targetCount == initVariable || (targetCount == initVariable - 1)) {
			restr.append(more);
		}
		return restr.toString();
	}


  发现byte[] b和char[] tempchar 使用完后没有释放(本人不太相信GC),手动释放一下,在return 前加:
		b = null;
		tempchar = null;
		s1=null;


引用

1.0000 112.989M 7.625M 105.364M 166567 java.util.HashMap
0.7867 88.893M 16.189M 72.704M 707325 java.util.HashMap$Entry
0.5333 60.252M 60.252M 0.000M 497341 char[]
0.5281 59.665M 11.515M 48.151M 503080 java.lang.String
0.4842 54.709M 54.709M 0.000M 17755 byte[]
0.3689 41.682M 9.209M 32.473M 170534 java.util.HashMap$Entry[]


重构后虽然变小了,但也很大。不知道是哪个地方使用了char[]和byte[],或者其它包使用了又没有释放。

分享到:
评论
7 楼 kaneg 2008-08-27  
strongkill 写道
load average: 0.21, 0.39, 0.31

load 连1都不到,哪来的压力啊
6 楼 strongkill 2008-08-27  
robbin 写道
byte[]和char[]多是很正常的,凡是Java里面的String操作最终都会转化为char[]的,凡是IOStream的操作都会转化为byte[],所以看这个是看不出来的。

你要过滤一下系统类,重点检索应用程序自定义的类,HttpSession引用的类的数量变化。



嗯,其实系统现在运行的很正常,load average: 0.21, 0.39, 0.31

只是担心会出问题。
5 楼 robbin 2008-08-27  
byte[]和char[]多是很正常的,凡是Java里面的String操作最终都会转化为char[]的,凡是IOStream的操作都会转化为byte[],所以看这个是看不出来的。

你要过滤一下系统类,重点检索应用程序自定义的类,HttpSession引用的类的数量变化。
4 楼 strongkill 2008-08-27  
就算系统执行了gc
[INFO ][memory ] 24190.256: parallel nursery GC 869440K->632640K (1048576K), 71.019 ms
这部份内存还是释放不了。

引用
1.0000 114.316M 7.795M 106.521M 170294 java.util.HashMap
0.7829 89.501M 16.504M 72.998M 721067 java.util.HashMap$Entry
0.7141 81.632M 81.632M 0.000M 707593 char[]
0.6617 75.643M 16.389M 59.254M 716066 java.lang.String
0.5828 66.625M 66.625M 0.000M 60001 byte[]
0.4126 47.171M 0.035M 47.137M 754 com.caucho.db.store.ReadBlock
0.3722 42.554M 9.701M 32.853M 175836 java.util.HashMap$Entry[]
0.2268 25.921M 7.605M 18.316M 332268 java.util.ArrayList
0.1852 21.172M 7.764M 13.408M 339205 org.mira.lucene.analysis.dict.a
0.1675 19.150M 18.259M 0.891M 338907 java.lang.Object[]
0.1580 18.065M 4.170M 13.895M 45547 com.caucho.server.dispatch.Invocation
3 楼 strongkill 2008-08-27  
SeanHe 写道
推荐你看一下这个http://fly-hyp.iteye.com/blog/182582
其实tempchar = null对GC并没有帮助


看过了。不过看了跟没有看一样。哈。
2 楼 LucasLee 2008-08-27  
在一个方法里面的变量是不会引起内存泄露的。
内存泄露都是发生在类变量和实例变量(且此实例被缓存、如单例模式)里。
我建议你从HashMap、HashMap$Entry 入手查查。
我也研究过一阵子的内存泄露问题,最终解决了。
1 楼 SeanHe 2008-08-27  
推荐你看一下这个http://fly-hyp.iteye.com/blog/182582
其实tempchar = null对GC并没有帮助

相关推荐

    heapdump分析工具

    通过分析heapdump文件,我们可以找出占用内存较大的对象,追踪内存泄漏的源头,以及了解对象生命周期和垃圾收集情况。 要生成heapdump,可以使用JVM内置的命令行选项,例如`-XX:+HeapDumpOnOutOfMemoryError`来配置...

    heapdump-tool工具

    2. **分析Heap Dump**:生成的heapdump文件通常较大,包含大量信息,此时heapdump-tool工具能够解析这些数据,提供直观的报告,帮助开发者找出内存占用过高的对象,识别潜在的内存泄漏。 3. **内存分析**:heapdump...

    Heap Dump的IBM分析工具.zip

    当程序运行时遇到内存问题,如频繁的垃圾回收或内存溢出,生成heap dump可以帮助开发者找出内存占用异常的对象,从而定位内存泄漏的源头。 IBM提供了强大的内存分析工具,例如VisualVM和MAT (Memory Analyzer Tool)...

    内存泄露分析工具(IBM HeapAnalyzer 和 Pattern Modeling and Analysis )

    它能够帮助开发者理解内存消耗模式,找出可能的内存泄漏源。 PMA的主要特性包括: 1. **模式匹配**:内置多种内存泄漏模式,如“长生命周期对象持有短生命周期对象”等,自动识别可能的问题。 2. **内存使用趋势**...

    heapdump.rar

    在处理heapdump文件时,调试器能够加载这个文件,并提供界面或者API供用户分析内存使用情况,找出那些没有被释放的内存块。 在处理heapdump文件的过程中,一般会遵循以下步骤: 1. **生成heapdump**:在程序运行...

    java 内存溢出分析工具 HeapAnalyzer

    HeapAnalyzer是一款Java内存分析工具,由IBM开发,它可以帮助开发者检查和分析Java堆内存的状态,找出可能存在的内存泄漏或者过度占用内存的对象。通过分析heap dump文件,HeapAnalyzer可以展示对象的分布情况,识别...

    IBM HeapDump Analyser

    在Java应用程序运行过程中,如果出现内存占用过高或者内存泄露的情况,堆转储(Heap Dump)文件就会变得尤为重要,因为它记录了程序在特定时间点的内存状态。IBM HeapDump Analyser能帮助我们解析这些文件,从而深入...

    IBM WEBSPHERE heapdump分析工具 ha456

    4. 通过这些信息,可以识别哪些对象占用了大量内存,从而找出可能的内存泄漏点或过度使用的数据结构。 5. 结合WebSphere的应用日志和其他监控数据,进一步分析问题原因并制定解决方案。 总的来说,IBM WebSphere的...

    ibm HeapAnalyzer JVM内存分析工具 ha457.jar下载

    通过这个快照,它可以显示所有对象及其引用关系,以便找出那些占用大量内存但未被释放的对象。 2. **对象概览**:提供一个概览视图,列出了所有类及其实例数量和内存占用。这有助于快速识别可能存在内存泄漏的类。 ...

    ha25.zip-分析heapdump日志

    在ha25.zip中,可能包含了这样的heapdump文件,它能帮助我们找出哪些对象占用了大量内存,或者是否存在无法释放的内存。 "readme25.zip"可能是一个包含分析指南或步骤的文档,它将指导用户如何解析heapdump文件,...

    IBM heapdump分析工具

    - **IBM Memory Analyzer (MAT)**: 这是IBM提供的专业heapdump分析工具,能够帮助开发者识别内存泄漏,计算对象引用链,提供内存占用报告等。 - **JConsole**: 虽然不是IBM官方工具,但也是Java标准监控工具之一,...

    利用wsadmin生成javacore,heapdump文件

    5. **分析文件**:生成的javacore和heapdump文件可以用专门的分析工具打开,如IBM Heap Analysis Tool (HAT),Eclipse Memory Analyzer (MAT)等,它们能提供可视化的分析结果,帮助找出问题。 6. **注意问题**:在...

    IBM WebSphere Heapdump Analyzer

    通过比较不同时间点的heapdump,可以追踪对象生命周期,找出导致内存持续增长的原因。 2. **对象统计与分析**:该工具能够统计各种类别的对象数量,以及它们占用的总内存,帮助用户识别可能存在问题的对象类型。 3...

    jmap -dump:format=b,file=heapdump.hprof Pid堆栈文件分析工具

    2. **支配树分析**:通过支配树,我们可以找出哪些对象占用了最多的内存,并追踪它们的引用链,从而识别出可能导致内存泄漏的对象。 3. **碎片分析**:MAT可以帮助我们检测堆内存中的碎片,这可能会影响垃圾收集的...

    ibm HeapAnalyzer java内存分析工具 ha457.jar

    4. **对象比较**:对比两个不同时间点的heap dump,找出对象数量或大小有显著变化的部分。 5. **内存指纹**:识别重复数据,例如大量相同的字符串常量或大对象,可能暗示内存浪费。 除了这些核心功能,HeapAnalyzer...

    [微软工具] 基于WinDbg的内存泄漏分析 - 比较复杂情况下调试

    找出泄漏的原因可能涉及忘记释放内存、保留了过期的指针引用、循环引用等问题。 6. **修复内存泄漏**: 识别出泄漏后,修复工作就相对简单了。可能是修改代码以确保每次分配都有对应的释放,或者调整数据结构以...

    idea git提交内存溢出后dump文件

    这些工具可以帮助我们找出内存泄漏的根源,例如查找长时间存活且占用大量内存的对象,或者查看是否有大量的重复对象实例。 内存溢出的原因可能有多种: 1. **过大对象或集合**: 创建了非常大的单个对象,或者集合类...

    ibm-java-堆内存分析工具-heapanalyzer

    HeapAnalyzer是IBM提供的一款免费的内存分析工具,它能够分析IBM J9虚拟机生成的heapdump文件,帮助开发者找出内存泄漏、过度对象分配和内存碎片等问题。通过可视化界面,用户可以直观地查看内存中的对象分布,...

    JVisualVM简介与内存泄漏实战分析

    - **进行堆转储**:在怀疑存在内存泄漏的情况下,可以通过jVisualVM进行堆转储(Heap Dump)。随后,可以将不同时间点的堆转储文件进行比较,找出哪些对象在持续增长。 - **对比两个堆转储文件**:使用“与另一个堆...

    java使用JMAP定位代码内存泄漏在哪

    2. **Dominator Tree**:这个视图显示了对象之间的支配关系,帮助我们找出占用内存最大的对象。 3. **Top Consumers**:列出占用内存最多的对象和类,便于我们定位问题。 4. **OQL (Object Query Language)**:MAT...

Global site tag (gtag.js) - Google Analytics