JVM崩溃hs_err_pidXXXX.log文件已创建。但是没有生成hprof文件

时间:2013-11-22 05:48:53

标签: java jvm crash-dumps

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

中的以下异常
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:总共24个(每个cpu 16个核心,每个核心2个线程)系列6个模型13步进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)服务器虚拟机(11.2-b01),于2009年1月17日09:52:33由“VC_re”与MS VC ++ 7.1构建

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

当创建hs_err_pidXXXX.log文件时,还创建了hprof文件,是否强制性?

2 个答案:

答案 0 :(得分:2)

当OutOfMemoryError伴随“Out of swap space?”时尝试在本机级别上分配资源时发生错误。在你的情况下,它似乎是一个内部C ++ - 程序无法分配所需的内存。这似乎是没有创建堆转储的原因:当在本机级别失败时,VM的内置错误处理可能没有机会接管 - 而不是java级别的错误,如耗尽(Java的)堆空间。

默认情况下,Windows NT用户空间为2GB,因为你的java堆已经是1,7GB,因此非堆内存没有太大的余量,你的应用程序似乎碰到了那里的天花板。

您可以尝试修复错误的两件事:

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

答案 1 :(得分: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异常。如果应用程序选择捕获它并继续   要运行,下一个OutOfMemoryError永远不会导致堆转储   写入!

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

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