【问题标题】:Analyzing a heap dump for out of memory error分析堆转储中的内存不足错误
【发布时间】:2015-11-09 19:30:32
【问题描述】:

我正在尝试使用 OOME 的堆转储来分析问题,为此我使用 MAT。 我读到了如何使用 MAT here

这是一个部署在tomcat服务器上并使用spring和hibernate的web应用程序。当我看到转储的支配树时,我只能看到休眠对象,这是否意味着内存泄漏是我的休眠将对象保存在内存中造成的,或者我在这里遗漏了什么?

下面是支配树的截图。

【问题讨论】:

  • 你真的确定这真的是泄漏吗?可能只是内存不够。仅查看图表不足以了解泄漏的原因 - 您需要找到未进行垃圾收集但必须进行垃圾收集的对象,并了解谁保留了对它们的引用以及原因。
  • 我不是 100% 确定,但它看起来像是泄漏,因为当我在休眠映射中检查该对象时,它包含我仅在需要插入数据库时​​使用的数据,这是由特定流程完成的,并不常见。

标签: java hibernate memory memory-leaks


【解决方案1】:

根据您上传的图片,我们无法得出存在内存泄漏的结论,并且显示的对象是导致内存泄漏的原因。

如果一个对象没有被任何其他对象引用,基本上一个对象会被 JVM 收集垃圾。内存泄漏是指一个对象在逻辑上不再有用,但由于内存中另一个对象的不需要的引用而留在内存中。

如果您尝试测试应用程序中的内存泄漏,您所要做的就是识别每次访问应用程序时在堆中累积的对象。有效地识别对象首先取和初始堆。然后在您的应用程序中执行一些操作。然后离开应用程序,以便发生 GC,然后进行堆转储。该工具提供了一个比较堆转储的选项,这将识别从基本堆转储急剧增加的对象。然后你可以深入到对象中来识别谁持有这个对象的引用。

【讨论】:

    【解决方案2】:

    尝试使用启用了“记录分配堆栈跟踪”选项的 jvisualvm 分析器来查找这些对象的创建位置,然后您可以分析存储它的位置...

    【讨论】:

      猜你喜欢
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      相关资源
      最近更新 更多