【问题标题】:Does not Java create heapdump when native allocation fails当本机分配失败时,Java 不创建堆转储
【发布时间】:2014-11-27 08:37:21
【问题描述】:

JVM 使用参数 -XX:+HeapDumpOnOutOfMemoryError 启动。但它不会在内存不足时创建堆转储。

本地分配失败时Java不创建堆转储吗?

以下是日志:

# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 1184288 bytes for Chunk::new
# An error report file with more information is saved as:
# D:\product\bin\hs_err_pid5876.log
java.lang.OutOfMemoryError

--编辑--

最大堆大小设置为 4GB,系统 RAM 大小为 16GB,当内存耗尽时,它使用 >11GB(由 Windows 任务管理器显示)。

从与@alain.janinm 的讨论中......我想我可以得出结论,JVm 甚至没有足够的内存来生成堆转储。

那么,是否有可能创建 heapdump 导致 JVM 使用了那么多系统内存

【问题讨论】:

  • 您使用的 Java 版本是什么?
  • 我正在使用 jdk1.6 @alain.janinm
  • 请问您能提供确切的版本吗?这是25号更新吗?这个版本有这个错误:bugs.java.com/view_bug.do?bug_id=7042582。页面末尾有一个解决方法。
  • 它的 JRE 版本:6.0_45-b06........我没有确切的 JDK 版本.......@alain.janinm
  • 好吧,也许你在崩溃时真的没有可用内存了。我不是指堆大小,而是实际的计算机内存。您知道崩溃时堆的大小以及计算机上的可用内存吗?

标签: java java-native-interface out-of-memory native-code heap-dump


【解决方案1】:

根据错误,java.lang.OutOfMemoryError 已被抛出。堆栈跟踪的其余部分表明它发生在本机堆中。因此,分配失败是在 JNI 或本机方法中检测到的,而不是在 Java VM 代码中检测到的。 (来自Troubleshooting memory leaks

这可能就是没有创建堆转储的原因。根据XX:+HeapDumpOnOutOfMemoryErrordocumentation

-XX:+HeapDumpOnOutOfMemoryError 命令行选项告诉 HotSpot VM 在无法满足来自 Java 堆或永久代的分配时生成堆转储。

因为在本地堆而不是 java 堆中分配失败,所以没有创建转储。

【讨论】:

  • 但它抛出了 java.lang.OutOfMemoryError.... 这不意味着它们都发生了吗?
  • 不,根据您提供的日志,在这种情况下,它仅由本机堆抛出。如果是 java 堆,你会在日志中有这个Java heap space
猜你喜欢
  • 2015-07-08
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多