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

问题描述 投票:6回答:3

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

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

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

java memory-leaks out-of-memory heap-dump
3个回答
10
投票

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


1
投票

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

this video

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

当我处理非平凡的内存问题时,我只使用MAT,而且就我记忆中的问题,我解决了所有这些问题。


0
投票

一般来说,你基本上做的是分析“什么是最大的RAM”?那么当你想出来的时候(以及“这可能是我的RAM耗尽的问题吗?”)那么你试着弄清楚为什么周围有这么多的物体。它们是被引入物体而不需要物体引用的吗?或者那是不小心抓住了它们不应该引用的东西?您是否使用过大的架构/范例(例如:将所有内容存储在一个大阵列中)?在返回之前,您的数据库客户端是否将大型ResultSet“缓冲”到RAM中?等等...

© www.soinside.com 2019 - 2024. All rights reserved.