问题标签 [heap-dump]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
1368 浏览

java - Java 堆转储有许多巨大的数组

我正在分析我的程序的内存使用情况,我意识到它正在使用 50 mb 的内存......它可能需要这一切来做什么?(程序相当简单,它不是 hello world,但它只有 937 个非空白行)。所以我把它放到 jhat 中,我得到了很多信息,这些信息并没有表明所有这些 Integer、Character 和 Byte 数组的引用。

这是显示最大内存消耗的图像:

总体内存使用情况

当你点击 时class[I,有很多看起来像这样的东西:

未知参考数组示例

在近 5000 个实例计数中,大部分内存使用量在最大的 22 个数组中(我使用 excel 计算出来),其中 15 个的大小为 2677104。它们似乎是几乎完全为零的数组,如下所示:

示例大数组

来自根集的参考链什么也没提供。单击“从此处可访问的对象”并没有提供任何有用的信息,我认为:

在此处输入图像描述

什么在使用这个内存?我正在使用以下库:netty 3.6.5、mbassador 1.1.7、guice 3.0、guava 14.0.1、logback 1.0.11、joda-time 2.1、gson 2.2.3。

更新:我在 Eclipse MAT 中运行完全相同的堆转储并得到不同的结果......

垫转储

我想知道这些大型数组是否已安排用于 GC 并且 MAT 是否将它们过滤掉?也许我分析我的程序太早了......“大约 97% 的时间:过早的优化是万恶之源” - Donald Knuth

0 投票
8 回答
2283 浏览

java - 如何通过“java.lang.String”解决 java.lang.OutOfMemoryError 错误,由“加载”" Eclipse 内存分析器

我正在读取一些大型 XML 文件并将它们存储到数据库中。它大约为 800 mb。

它存储许多记录,然后终止并给出异常

使用内存分析器,我创建了 .hprof 文件,其中显示:

我有用于检索值的 setter 和 getter。我该如何解决这个问题。任何帮助将不胜感激。

在此处输入图像描述

我已经通过JRE增加了内存。初始化_ 但问题没有解决

编辑:我正在使用 scireumOpen 来读取 XML 文件。

我使用的示例代码:

0 投票
0 回答
1062 浏览

java - 从 Java 堆转储中导出(或序列化)对象

我有一个(以前)正在运行的 Java 进程的堆转储。在进行转储时,进程挂起与另一台服务器通信。我希望能够重建我的应用程序提出的确切请求。

尽管我的客户端与 SOAP Web 服务通信,但模型对象恰好是Serializable,所以我想做的是导出请求对象(Serializable如果可能,使用它的形式),然后我可以轻松地重新导入该对象(只需反序列化它) 进入测试应用程序。

我的问题是我找不到从堆转储中导出对象的方法。我可以使用 找到有问题的对象OQL所以我知道它就在那里——我只是找不到任何工具可以提供任何方式从堆转储中获取对象。

由于我的课恰好是Serializable我认为这将是最简单的。但是,如果我能以任何其他可解析的格式将其取出,我就可以通过编程方式重建该对象。

想法?

0 投票
1 回答
3189 浏览

java - -XX:+HeapDumpOnCtrlBreak 无法创建 jvm?

当我添加到以下一个 jvm 参数时

-XX:+HeapDumpOnCtrlBreak

我收到无法启动 JVM 的错误。

无法创建 Java 虚拟机

我使用的 Java 版本是1.6.0_21.

我做错了什么?我需要设置任何其他参数吗?

0 投票
1 回答
228 浏览

java - JVM堆转储分析指向sun.awt.windows.WToolkit?

我正在分析我们应用程序中的内存泄漏。在使用Eclipse Memory Analyzer进行一些调查后,我认识到“保留”所有引用的根是 `

sun.awt.windows.WToolkit

在此处输入图像描述

现在我不知道如何解释这个结果。我认为 sun.awt.windows.WToolkit 不应该导致泄漏。也许有人建议如何解释这个结果?

我们尝试检查的一个想法是它是由我们使用的 JIDE 库引起的,http://www.jidesoft.com/但很难说它是否与它有关。

0 投票
1 回答
340 浏览

memory - 用于大更新/插入的 DataNucleus 内存/缓存处理

我们在 Spring 上下文中运行应用程序,使用 DataNucleus 作为我们的 ORM 映射和 mysql 作为我们的数据库。

我们的应用程序每天都会将一些数据输入到我们的数据库中。数据馈送的大小转化为大约 100 万行插入/更新。导入的性能开始时非常好,但随后会降低超时(随着执行的查询数量增加),并且在某些时候应用程序冻结或停止响应。在应用程序再次响应之前,我们将不得不等待整个工作完成。

这种行为对我们来说看起来很像内存泄漏,我们一直在努力查看我们的代码以发现任何潜在的问题,但是问题并没有消失。我们从堆转储中发现的一件有趣的事情是 org.datanucleus.ExecutionContextThreadedImpl(或 HashSet/HashMap)在导入期间占据了我们 90% 的内存(5GB)。(我附上了下面转储的屏幕截图)。我在互联网上的研究表明这个参考是 Level1 缓存(不确定我是否正确)。我的问题是在大型导入期间,我如何限制/控制一级缓存的大小。可能会要求 DN 在我的导入过程中不缓存?

如果那不是 L1 缓存,我的内存问题的可能原因是什么?

我们的代码为每个插入使用一个事务,以防止锁定数据库中的大量数据。每 2000 次插入调用一次 flush 方法

作为一项临时修复,我们将导入过程移动到在没有人使用我们的应用程序时在一夜之间运行。显然,这不可能永远持续下去。请有人至少指出我们正确的方向,以便我们可以做更多的研究,并希望我们能找到解决办法。

如果有人知道解码堆转储会很好

我们所有人都会非常感谢您的帮助。非常感谢!

https://s3-ap-southeast-1.amazonaws.com/public-external/datanucleus_heap_dump.png

https://s3-ap-southeast-1.amazonaws.com/public-external/datanucleus_dump2.png

下面的代码 - 此方法的调用者没有事务。此方法每次调用将处理一个导入对象,我们每天需要处理大约 100K 的这些对象

}

0 投票
1 回答
2051 浏览

visual-studio - 使用 Visual Studio 从转储文件预览堆

我对调试转储非常陌生,所以仍有一些问题。

我已经阅读了一些关于调试转储的问题,现在我已将我的代码附加到转储中,并且可以看到一些变量值。

我的问题是如何预览原始堆数据。我想要这个,因为转储非常大,超过 4GB,所以某个地方存在很大的内存泄漏,这可能是导致崩溃的原因。所以会寻找一些剩下的字符串。

顺便提一句。我正在使用 C++ 进行编码并使用 Visual Studio 2012 进行调试,但我可以下载一些其他程序 :)

0 投票
0 回答
245 浏览

java - 堆转储的总大小超过使用的堆/永久 gem

我正在使用 VisualVM + VisualGC 分析此工具的内存使用情况。我注意到一些我没有预料到的事情,这可能暴露了我对 JVM 和堆转储的误解。

为了给出完整的上下文,我正在分析的应用程序会查找一个巨大的序列化 blob,然后我正在打印使用jamm的大小。之后,该应用程序就坐在那里等待中止。

使用 VisualVM,我看到堆使用量按预期增长。一旦操作完成并且应用程序只是坐在那里睡觉,我会使用 VisualVM 触发一次 GC(或者更确切地说,是多个 GC,点击按钮我会忘乎所以)。

  • 此时已用堆为 ,1,849,825,472 bytesPermGem 已用空间为25,864,448 bytes.
  • 此时,我执行了一个堆转储,这显然需要一段时间,但是当堆转储完成时,使用的堆仍然1,944,542,296 bytes与 PermGen 大致相同25,892,800 bytes

  • 重点是:堆转储显示的总字节数为2,299,816,089.

什么可以解释这种差异?我重复了几次实验,我总是得到相同的结果。

0 投票
1 回答
1193 浏览

java - 为什么 Java 堆分配调整大小会导致 OOME?

为什么 Java 堆分配调整大小会导致 OOME?

我们在日志中看到 OutOfMemoryExceptions,它们似乎与 java 堆提交大小从 ~1G 增长到 ~2.4G 一致。尽管有错误消息,但似乎我们没有用完堆空间。除了抛出异常(并生成堆转储)之外,调整大小似乎最终成功并且应用程序继续运行而没有问题(大约 2.4G 堆提交大小)。

这是日志输出的示例:

请注意,在 OOME 之前,提交的总堆在 1GB 和 2.4GB 之间波动。我们可以看到它之前相当稳定在 1GB,之后相当稳定在 2.4GB。

此 1.6.0._24 JVM 的 javaopts 包括:

  • -Xmx3072m
  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:-UseGCOverheadLimit
  • -详细:gc
  • -Xss256k
  • -XX:MaxPermSize=256m
  • -服务器
  • -XX:+PrintGC详情

JVM 正在运行 1.6.0._24。我们现在无法更改版本,但在接下来的一两个月内会有一个窗口可以这样做。如果 1.6.0_45 更加稳定,我们将致力于切换到该版本。我们目前正在对其进行测试。

该机器只有 4GB 的总系统内存。此外,还使用了一个小型 RAM 磁盘。我担心 Xmx 设置对于这个环境来说已经太高了。

这让我们感到困惑,因为在异常发生时堆使用量似乎不是很大。为什么我们会得到这个 OOME?

更新:我们试图通过将初始内存 (Xms) 设置为等于最大内存 (Xmx) 来防止这种情况。到目前为止,尽管我们尚未在生产中引入变化,但这些实验一直很有希望。它仍然没有解释为什么首先会发生 OOME,尽管它似乎表明可以在不增加最大堆大小(或减少应用程序内存占用)的情况下避免 OOME。那么为什么堆大小调整会导致 OOME 仍然是个谜?

0 投票
1 回答
846 浏览

java - jmap转储不工作

没有抛出异常,但我仍然无法在我的桌面文件夹中找到 dump.bin 文件,我的路径是否错误?