我的java jar只是一个较大的程序使用的众多jar中的一个。我正在尝试确定我的代码是否是内存泄漏的原因,或者我的代码之外是否存在其他问题。我正在使用jvisualvm,并且已经识别了我的所有类,并且没有一个类似乎是可疑的。查看采样器,我可以看到就大小和创建的实例而言,byte[]、char[]和int[]似乎是最大的用户。问题是,我不能确定他们属于谁。我知道我的程序中有各种byte[],但由于有大约32,000个实例,很难逐个确定它们的来源。有没有一种方法可以过滤数据,以便只能查看来自特定jar或区域的项目?谢谢。
发布于 2012-12-13 18:09:59
除非您知道您正在创建大量的byte[]或String实例,否则我不会将赌注押在byte[]或char[]是问题的根源上。几乎我研究过的每个堆都有大量这样的东西,因为它们用在java内部的很多地方。我并不是说它们不能成为问题所在,但首先专注于您知道正在创建的不寻常数量的对象会更有成效,即使它们不是堆中最大的东西。
我个人发现MAT比VisualVM更适合分析工作,尽管VisualVM在动态监视内存使用和监视GC周期方面很棒。
MAT还允许您向下钻取以查看对保留对象的传入和传出引用。这将使您更好地了解哪些对象占用的内存比您预期的要多,并帮助您找出JAR中的某个对象是否是罪魁祸首。
MAT附带的帮助文档非常好,绝对值得一读,以帮助您入门。
如果您想更深入地了解这个问题,请阅读OQL,它可以用来查询MAT和VisualVM中的堆。
可在此处找到MAT:http://www.eclipse.org/mat/
我翻出了一些背景读物(其中一些有点过时,但仍然与如何解决问题的更好图景相关)
Leaks are easy to find, but memory usage analysis is bit more difficult
Memory leaks are easy to find
Finding memory leaks with SAP memory analyser
在查看堆时,了解一下GC也是值得的,因此值得一看:
GC Tuning
Diagnosing a Garbage Collection problem
https://stackoverflow.com/questions/13842956
复制相似问题