繁体   English   中英

如何分析 .hprof 文件中的堆数据并使用它来减少内存泄漏?

[英]How to analyze heap data from .hprof file and use it to reduce memory leaks?

最近,我在运行应用程序时遇到了java.lang.OutOfMemoryError异常。

在一个这样的实例中,我能够使用jvisualvm获取堆转储。

我可以使用NetBeans 8.1 IDE 打开从堆转储中获得的.hprof堆转储文件,但我不知道如何分析数据转储。 我想知道如何读取转储文件并采取纠正措施从应用程序的角度减少内存不足异常。

有很多方法可以找到内存泄漏的根本原因,例如使用JProfiler等分析器并简单地应用此精彩视频中描述的内容。 您还可以查看Eclipse 内存分析器,也称为MAT ,它将能够分析您的堆转储并提出内存泄漏的潜在原因,如您在此视频中看到的(您可以在此处找到有关可疑报告的更多信息) . 另一种方法是通过应用这种方法来使用Java Flight Recorder 或者使用本视频中描述的方法使用JVisualVM

这个案例你需要的工具是这个应用程序:

内存分析器工具

只需下载并启动,然后加载您的 hprof 文件。 这可能需要一两分钟,具体取决于您的 hprof 的大小,但随后您将看到有关内存使用情况的很好的分析。 它非常易于使用,并自动突出显示潜在的内存泄漏,从不同角度对数据进行分析。

当我处理重要的内存问题时,我只使用 MAT,并且据我所知,我解决了所有这些问题。

大多数情况下,您只需要知道哪些类最容易占用内存。 您可以使用: jmap -histo 针对正在运行的进程,如果它是大型 JVM,这很方便……您不想摆弄大型堆转储文件。 它必须以拥有该进程的同一 Linux 用户身份运行,因此例如在 Linux 中,您可以使用:

sudo -u <user> jmap -histo <pid>

显然,“histo”是“histogram”的缩写。 这会将直方图转储到标准输出,因此您可能希望将其通过管道传输到文件进行分析。 它将按实例数 * 实例大小排序,因此查看前 10 个条目,您可能会有答案。

一般来说,基本上你所做的是分析“什么是使用最多的内存”? 然后当你弄清楚了(“这可能是我用完 RAM 的问题吗?”)然后你试着弄清楚为什么有这么多这样的对象。 它们是否被持有对象但不需要的东西引用? 或者那是不小心保留了不应该的东西的引用? 您是否使用了过多的架构/范式(例如:将“所有内容都存储在一个大数组中”)? 在返回它们之前,您的数据库客户端是否将大型 ResultSet“缓冲”到 RAM 中? 等等...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM