使用Visualvm检测内存泄漏

时间:2012-12-12 15:25:21

标签: java memory-leaks jvisualvm

我的java jar只是大型程序使用的众多内容之一。我试图确定我的代码是否是内存泄漏的原因,或者我的代码之外是否还有其他问题。我正在使用jvisualvm,并确定了我的所有课程,但似乎没有人怀疑。看看采样器,我可以看到byte [],char []和int []在大小和创建的实例方面似乎是最大的用户。问题是,我无法确定他们属于谁。我知道我的程序中有各种byte [],但由于有大约32,000个实例,因此很难确定源代码逐一查看它们。有没有办法过滤数据,以便只能查看来自某个罐子或区域的物品? 感谢。

1 个答案:

答案 0 :(得分:1)

除非您知道自己正在制作大量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