java - 使用Jvisualvm检测内存泄漏

标签 java memory-leaks jvisualvm

我的 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/

相关文章:

java - 如何自动将 JVisualVM 附加到短期程序?

Java HashMap 只返回列表的最后一个元素

java - 当 Logback 的 AsyncAppender 崩溃时,排队的消息会发生什么?

java - 定位 fragment 内回收器 View 项内的按钮监听器

linux - 分析网络应用程序中的资源泄漏(套接字处理程序等)

javascript - 在 Chrome 中获取大型 AJAX 响应而不会崩溃

java - jvisualvm:卡在 "Loading Heap Dump"屏幕上

java - EditText 不出现复制粘贴选项

AVFAudio 的 IOS 内存泄漏 - AVAudioSession

Java 内存分析显示异常的对象分配和释放