【发布时间】:2011-09-14 17:33:12
【问题描述】:
有关此问题的更新 - 见下文。
我遇到了一个(至少对我来说是可重现的)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 内存统计信息。 我获取了直到崩溃前最后一刻的内存消耗统计信息。
统计显示以下分配的内存大小:
- HeapSize:751 MB(使用 248 MB)
- 非堆大小(PermGen 和 CodeCache):150 MB(使用 95 MB)
- 内存管理区域的大小(Edenspace、Old-gen 等):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+线程堆栈
谁能帮我弄清楚这里出了什么问题?
(注意:我最近从 Eclipse 3.4.2 升级到 Eclipse 3.6.2,从 Java 5 升级到 Java 6。我怀疑崩溃和这些更改之间存在联系,因为我以前没有见过这些)
更新
It seems to be a JVM bug 在 Java 6 Update 25 中引入,与新的 jit 编译器有关。另见this blog entry. 根据博客,这个错误的修复应该是下一个 java 6 更新的一部分。 与此同时,我在崩溃期间获得了本机堆栈跟踪。我已经更新了上面的崩溃日志。
建议的解决方法,使用 VM 参数 -XX:-DoEscapeAnalysis 有效(至少它显着降低了崩溃的可能性)
【问题讨论】:
-
您可能将最大内存大小设置得太高,以至于 32 位空间无法支持。通常 JVM 会检测到这一点,但您可能会以无法检测到的方式接近极限。
-
如果你将
PermSize增加到512m并添加-XX:PermSize=512m,是否还会出现错误? -
这是哪个版本的 Java 6?描述类似于this bug ID,除了线程转储。
-
然后检查错误报告并尝试解决方法。或者使用 u23。
-
@Vineet 根据报告(这是重复的,也可以看看原始的错误报告)使用
-XX:+DoEscapeAnalysis时导致内存问题。但是,我不使用该选项。
标签: java windows eclipse crash jvm