如何找到Java内存泄漏问题

10 浏览
0 Comments

如何找到Java内存泄漏问题

如何在Java中找到内存泄漏(例如使用JHat)?我尝试在JHat中加载堆转储以进行基本查看。但是,我不明白我应该如何能够找到根引用(ref)或者叫什么名字的东西。基本上,我能知道有几百兆的哈希表条目([java.util.HashMap$Entry或者什么类似的),但地图随处可见...是否有一些方法可以搜索大型映射或者找到大型对象树的一般根呢?

[编辑]

好吧,我已经读了到目前为止的答案,但是让我们说我是个小气的人(意思是我更喜欢学习如何使用JHat而不是为了JProfiler付费)。此外,由于JHat是JDK的一部分,因此JHat始终可用。当然,除非JHat没有其他办法,但是使用暴力,但我不相信那可能是这种情况。

此外,我不认为我能够实际修改(添加所有映射大小的日志记录)并运行它足够长的时间以便我注意到泄漏。

admin 更改状态以发布 2023年5月21日
0
0 Comments

提问者在这里,我必须说获取一个不需要5分钟来回答任何点击的工具,可以更容易地找到潜在的内存泄漏问题。\n\n由于有很多人建议使用多种工具(我只尝试了JDK中的visual wm和JProbe试用版),所以我想我应该建议一个基于Eclipse平台的免费/开源工具,Memory Analyzer(有时被称为SAP Memory Analyzer),可以在http://www.eclipse.org/mat/上获得。\n\n这个工具的真正酷之处在于,当我第一次打开它时,它对堆转储进行了索引,这使它可以显示保留堆之类的数据,而不需要等待每个对象5分钟(几乎所有操作都比我尝试过的其他工具要快得多)。\n\n当您打开堆转储时,第一个屏幕会显示一个饼图,其中包含最大的对象(保留堆计数),您可以快速导航到大小超出舒适范围的对象。它还有一个“查找可能的泄漏嫌疑人”,我认为这很有用,但由于导航对我足够了,所以我并没有真正涉及它。

0
0 Comments

我使用以下方法来查找Java中的内存泄漏。我已经成功地使用jProfiler,但我相信任何具有图形能力(差异以图形形式更易于分析)的专业工具都可以使用。\n\n

    \n

  1. 启动应用程序并等待直到它进入“稳定”状态,即初始化完成且应用程序处于空闲状态。
  2. \n

  3. 运行被怀疑会产生内存泄漏的操作多次,以便任何缓存、与DB相关的初始化操作都能够进行。
  4. \n

  5. 运行GC并进行内存快照。
  6. \n

  7. 再次运行该操作。根据操作的复杂性和处理的数据大小,可能需要多次运行该操作。
  8. \n

  9. 运行GC并进行内存快照。
  10. \n

  11. 比较2个快照并进行分析。
  12. \n

\n\n基本上,分析应该从最大正差异开始,比如对象类型,并找出导致这些额外对象卡在内存中的原因。\n\n对于处理多个线程请求的Web应用程序,分析会变得更加复杂,但通用方法仍然适用。\n\n我做过很多旨在减少应用程序的内存占用的项目,这种通用方法与一些应用程序特定的调整和技巧总是表现良好。

0