我的 java jar 只是大型程序使用的众多 jar 之一。我试图确定我的代码是否是内存泄漏的原因,或者我的代码之外是否存在其他问题。我正在使用 jvisualvm,并且已经识别了我的所有类(class),并且没有一个类(class)看起来可疑。查看采样器,我可以看到 byte[]、char[] 和 int[] 在大小和创建的实例方面似乎是最大的用户。问题是,我无法确定它们属于谁。我知道我的程序中有各种 byte[],但由于有大约 32,000 个实例,因此很难一一确定它们的来源。有没有办法过滤数据,以便只能查看来自特定 jar 或区域的项目? 谢谢。
最佳答案
除非您知道自己正在创建大量 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
关于java - 使用Jvisualvm检测内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13842956/