我的应用程序(桌面应用程序)通过
中的以下异常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文件,是否强制性?
答案 0 :(得分:2)
当OutOfMemoryError伴随“Out of swap space?”时尝试在本机级别上分配资源时发生错误。在你的情况下,它似乎是一个内部C ++ - 程序无法分配所需的内存。这似乎是没有创建堆转储的原因:当在本机级别失败时,VM的内置错误处理可能没有机会接管 - 而不是java级别的错误,如耗尽(Java的)堆空间。
默认情况下,Windows NT用户空间为2GB,因为你的java堆已经是1,7GB,因此非堆内存没有太大的余量,你的应用程序似乎碰到了那里的天花板。
您可以尝试修复错误的两件事:
答案 1 :(得分:2)
对于以下内容,不会在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安装文件夹中。
但是,由于“脱离交换空间”被明确列为不写堆转储的原因,我认为这就是正在发生的事情。