我的 java jar 只是大型程序使用的众多 jar 之一。我正在尝试确定我的代码是否是导致内存泄漏的原因,或者我的代码之外是否还有其他问题。我正在使用 jvisualvm,并且已经确定了我所有的课程,而且似乎没有一个是可疑的。查看采样器,我可以看到就大小和创建的实例而言,byte[]、char[] 和 int[] 似乎是最大的用户。问题是,我无法确定他们属于谁。我知道我的程序中有各种 byte[],但是由于有大约 32,000 个实例,因此很难逐个确定来源。有没有办法过滤数据,以便只能查看来自某个罐子或区域的项目?谢谢。
1 回答
除非您知道您正在创建很多byte[]
或String
实例,否则我不会投入资金byte[]
或char[]
成为问题的根源。我挖过的几乎每一个堆都有大量的这些,因为它们被用于许多 java 的内部结构中。我并不是说它们不是问题,但首先专注于你知道你正在创建的异常数量的对象会更有成效,即使它们不是堆中最大的东西。
我个人发现 MAT 比 VisualVM 更适合分析工作,尽管 VisualVM 非常适合动态监控内存使用情况和观察 GC 周期。
MAT 还允许您向下钻取以查看对保留对象的传入和传出引用。这将使您更好地了解哪些对象占用的内存比您预期的要多,并且应该帮助您找出 JAR 中的一个对象是否是罪魁祸首。
MAT 附带的帮助文档非常好,绝对值得一读以帮助您入门。
如果您想进一步深入阅读 OQL 上的兔子洞,您可以使用它来查询 MAT 和 VisualVM 中的堆。
MAT 可以在这里找到:http: //www.eclipse.org/mat/
我挖出了一些背景资料(其中一些有点过时,但仍然有助于更好地了解如何解决问题)
泄漏很容易找到,但内存使用情况分析有点困难
内存泄漏很容易找到
使用 SAP 内存分析器查找内存泄漏
在查看堆时,还值得了解一些关于 GC 的知识,因此值得一读:
GC Tuning
Diagnosing a Garbage Collection problem