Java 6 Update 25 VM 崩溃:内存不足
有关此问题的更新 - 请参阅下文。
我遇到(可重现的,至少对我来说)JVM崩溃(不是OutOfMemoryError)(崩溃的应用程序是eclipse 3.6.2)。但是,查看崩溃日志使我想知道:
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 65544 bytes for Chunk::new
# Possible reasons:
# The system is out of physical RAM or swap space
# In 32-bit mode, the process size limit was hit
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Use 64 bit Java on a 64 bit OS
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
Current thread (0x531d6000): JavaThread "C2 CompilerThread1" daemon
[_thread_in_native, id=7812, stack(0x53af0000,0x53bf0000)]
Stack: [0x53af0000,0x53bf0000], sp=0x53bee860, free space=1018k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x1484aa]
V [jvm.dll+0x1434fc]
V [jvm.dll+0x5e6fc]
V [jvm.dll+0x5e993]
V [jvm.dll+0x27a571]
V [jvm.dll+0x258672]
V [jvm.dll+0x25ed93]
V [jvm.dll+0x260072]
V [jvm.dll+0x24e59a]
V [jvm.dll+0x47edd]
V [jvm.dll+0x48a6f]
V [jvm.dll+0x12dcd4]
V [jvm.dll+0x155a0c]
C [MSVCR71.dll+0xb381]
C [kernel32.dll+0xb729]
我使用的是 Windows XP 32 位 SP3。我有4GB内存。在启动应用程序之前,根据任务管理器,我有2 GB的空闲空间(+ 1 GB系统缓存,也可能被释放)。我肯定有足够的可用RAM。
从开始到崩溃,我使用visualvm和jconsole记录了JVM内存统计信息。我获取了内存消耗统计信息,直到崩溃前的最后一刻。
统计信息显示以下已分配的内存大小:
- 堆大小:751 MB(已用 248 MB)
- Non-HeapSize(PermGen & CodeCache): 150 MB (使用 95 MB)
- 内存管理区域的大小(伊甸空间、旧代等): 350 MB
- 线程堆栈大小:17 MB(根据 oracle 和由于 51 个线程正在运行的事实)
我正在使用参数运行应用程序(jre 6 update 25,服务器vm):
-XX:PermSize=128m
-XX:MaxPermSize=192m
-XX:ReservedCodeCacheSize=96m
-Xms500m
-Xmx1124m
问题:
-
为什么当虚拟机和操作系统上明显有足够的内存时,JVM 会崩溃?
使用上述设置,我认为我无法达到2GB 32位限制(1124MB + 192MB + 96MB +线程堆栈<2GB)。在任何其他情况下(堆分配过多),我宁愿期望出现内存外错误,而不是JVM崩溃
谁能帮我弄清楚这里出了什么问题?
(注意:我最近从 Eclipse 3.4.2 升级到 Eclipse 3.6.2,从 Java 5 升级到 Java 6。我怀疑崩溃和这些变化之间存在联系,因为我以前从未见过这些)
更新
它似乎是Java 6 Update 25中引入的JVM错误,与新的jit编译器有关。另请参阅此博客文章。根据博客,此错误的修复应该是下一个java 6更新的一部分。与此同时,我在崩溃期间获得了本机堆栈跟踪。我已经更新了上面的崩溃日志。
建议的解决方法,使用VM参数有效(至少它显着降低了崩溃的可能性)-XX:-DoEscapeAnalysis