Java 使用Jvisualvm检测内存泄漏
我的JavaJAR只是大型程序使用的众多jar之一。我试图确定我的代码是否是内存泄漏的原因,或者在代码之外是否存在其他问题。我正在使用jvisualvm,并且已经识别了我的所有类,并且没有一个类是可疑的。查看采样器,我可以看到byte[]、char[]和int[]在大小和创建的实例方面似乎是最大的用户。问题是,我无法确定它们属于谁。我知道我的程序中有各种各样的byte[],但是由于有大约32000个实例,很难确定逐个查看它们的源代码。是否有一种方法可以过滤数据,以便只查看来自某个jar或区域的项目?Java 使用Jvisualvm检测内存泄漏,java,memory-leaks,jvisualvm,Java,Memory Leaks,Jvisualvm,我的JavaJAR只是大型程序使用的众多jar之一。我试图确定我的代码是否是内存泄漏的原因,或者在代码之外是否存在其他问题。我正在使用jvisualvm,并且已经识别了我的所有类,并且没有一个类是可疑的。查看采样器,我可以看到byte[]、char[]和int[]在大小和创建的实例方面似乎是最大的用户。问题是,我无法确定它们属于谁。我知道我的程序中有各种各样的byte[],但是由于有大约32000个实例,很难确定逐个查看它们的源代码。是否有一种方法可以过滤数据,以便只查看来自某个jar或区域的项
谢谢。除非你知道你正在创建大量的
byte[]
或String
实例,否则我不会把钱花在byte[]
或char[]
作为问题的根源上。我挖掘的几乎每个堆都有很多这样的代码,因为它们被用于java的许多内部代码中。我并不是说它们不可能成为问题,但首先集中精力创建数量不同寻常的对象会更有成效,即使它们不是堆中最大的东西
我个人发现MAT比VisualVM更适合于分析工作,尽管VisualVM在动态监控内存使用和观察GC循环方面非常出色 MAT还允许您深入查看对保留对象的传入和传出引用。这将使您更好地了解哪些对象占用的内存比您预期的要多,并将帮助您确定JAR中的某个对象是否是罪魁祸首 MAT附带的帮助文档非常好,值得一读,以帮助您入门 如果您想进一步深入兔子洞,请阅读OQL,您可以使用它在MAT和VisualVM中查询堆 可在此处找到MAT:
我找到了一些背景资料(其中一些有点过时,但仍然与如何更好地解决问题有关)
在查看堆时,还需要了解一些关于GC的知识,因此有必要浏览以下内容:
我个人认为MAT更适合分析工作,更容易查看传入/传出的引用。你试过了吗?它能链接到外部运行的JVM吗?MAT在堆转储上工作。你认为你能找到一个吗?如果你进行堆转储,你应该能够看到对象被保留的位置。VisualVM允许您获取堆转储并加载它进行分析。堆转储?我确信JVisualVm允许我保存堆转储。那行吗?谢谢你提供的信息。我今天要好好读书。我对根本没有运行的代码所做的一些测试也指出了内存泄漏的其他来源。很高兴看到MAT已经证明了这一点,测试也支持了这一点。