【问题标题】:JVM Crash hs_err_pidXXXX.log file is created. But hprof file is not generatedJVM 崩溃 hs_err_pidXXXX.log 文件已创建。但是没有生成hprof文件
【发布时间】:2013-11-22 05:48:53
【问题描述】:

我的应用程序(一个桌面应用程序)通过

中的以下异常
java.lang.OutOfMemoryError: requested 4096000 bytes for GrET in C:\BUILD_AREA\jdk6_12\hotspot\src\share\vm\utilities\growableArray.cpp. Out of swap space?

出现上述错误的可能原因是什么。

这里是设置的 jvm 参数

VM 参数:

jvm_args: -Dsun.net.inetaddr.ttl=10 vfprintf exit abort -Xms5242880 -Xmx1711276032 -XX:NewSize=2621440 -XX:MaxNewSize=855638016 -XX:+HeapDumpOnOutOfMemoryError -Dsun.rmi.dgc.server.gcInterval= 60000 -Dsun.rmi.dgc.client.gcInterval=60000 -Djava.security.properties=wigan.java.security -Xss512K

--------------- S Y S T E M ---------------

操作系统:Windows NT 6.1 Build 7601 Service Pack 1

CPU:total 24 (16 cores per cpu, 2 threads per core) family 6 model 13 stepping 7, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, ht

内存:4k 页,物理 4194303k(4194303k 免费),交换 4194303k(4194303k 免费)

vm_info:用于 windows-x86 JRE (1.6.0_12-b04) 的 Java HotSpot(TM) 服务器 VM (11.2-b01),由“java_re”使用 MS VC++ 7.1 于 2009 年 1 月 17 日 09:52:33 构建

我在 jvm 参数中添加了 -XX:+HeapDumpOnOutOfMemoryError,但是 jvm 没有转储堆,我从来没有找到任何 .hprof 文件。为什么?

是否必须在创建 hs_err_pidXXXX.log 文件时同时创建 hprof 文件?

【问题讨论】:

    标签: java jvm crash-dumps


    【解决方案1】:

    当 OutOfMemoryError 伴随“Out of swap space?”时尝试在本机级别分配资源时发生错误。在您的情况下,内部 C++ 程序似乎未能分配所需的内存。这似乎是未创建堆转储的原因:当在本机级别失败时,VM 的内置错误处理可能没有机会接管 - 与 java 级别的错误相反,例如用完(java-)堆空间。

    默认情况下,Windows NT 用户空间是 2GB,因为您的 Java 堆已经是 1.7GB,所以留给非堆内存的空间已经不多,而且您的应用程序似乎碰到了天花板。

    您可以尝试两种方法来修复错误:

    • 减少 Xmx 以允许更多非堆内存
    • 尝试设置 /3GB 引导参数(不确定您的 Windows 版本是否支持此参数)以将系统空间减少到 1GB,从而将用户空间增加到 3GB

    【讨论】:

    • 您能否建议减小 Xmx 的大小。谢谢。
    • 这真的取决于你的应用程序 - 你可以从 -Xmx 1024m 开始,如果堆空间用完,请增加一点。
    【解决方案2】:

    引用Memory Analyzer wiki:

    堆转储未写入 OutOfMemoryError 用于以下情况 原因:

    • 应用程序自行创建并抛出 OutOfMemoryError
    • 另一个资源(例如每个进程的线程)已耗尽
    • C 堆耗尽

    至于 C 堆,最好的办法是看你不会得到堆转储 如果它发生在 C 代码中(下例中的 eArray.cpp):

    # An unexpected error has been detected by SAP Java Virtual Machine:
    # java.lang.OutOfMemoryError: requested 2048000 bytes for eArray.cpp:80: GrET*. Out of swap space or heap resource limit exceeded (check with limits or ulimit)?
    # Internal Error (\\...\hotspot\src\share\vm\memory\allocation.inline.hpp, 26), pid=6000, tid=468
    

    C 堆问题可能由于不同的原因而出现,例如没有交换 空间情况,进程限制耗尽或只是地址空间 限制,例如严重的碎片化或只是耗尽它 地址空间有限的机器,如 32 位机器。这 hs_err-file 将帮助您了解有关此类错误的更多信息。 无论如何,Java 堆转储不会有任何帮助。

    另外请注意堆转储只写在第一个 内存不足错误。如果应用程序选择捕获它并继续 要运行,下一个 OutOfMemoryError 将永远不会导致堆转储 写好了!

    如果创建了 .hprof,它会在出现错误消息时这样说。请注意,在 Windows 上,该文件不会位于应用程序文件夹中,而是位于临时文件夹或 Dr. Watson 安装文件夹中。

    但是,由于“交换空间不足”被明确列为不编写堆转储的原因,我认为这是正在发生的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-25
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      相关资源
      最近更新 更多