Java 6 Update 25 VM崩溃:内存不足

对于这个问题的更新 – 见下文。

我遇到一个(可重现的,至less对我来说)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内存。 在启动应用程序之前,根据任务pipe理器(+ 1 GB系统caching,可能会被释放),我有2 GB的空闲空间。 我肯定有足够的可用RAM。

从开始到崩溃,我使用visualvm和jconsolelogging了jvm内存统计信息。 我获得了内存消耗统计,直到崩溃前的最后时刻。

统计信息显示以下分配的内存大小:

  • 堆大小: 751 MB(使用248 MB)
  • 非HeapSize(PermGen&CodeCache): 150 MB(使用95 MB)
  • 内存pipe理区域的大小(Edenspace,Old-gen等): 350 MB
  • 线程堆栈大小: 17 MB (根据oracle和由于51个线程正在运行)

我运行的应用程序(JRE 6更新25,服务器VM)使用的参数:

 -XX:PermSize=128m -XX:MaxPermSize=192m -XX:ReservedCodeCacheSize=96m -Xms500m -Xmx1124m 

题:

  • 为什么当vm和OS上有足够的内存时,jvm会崩溃?
    有了上述设置,我认为我不能达到2GB的32位限制(1124MB + 192MB + 96MB +线程堆栈<2GB)。 在任何其他情况下(堆分配太多),我宁可期待一个OutOfMemoryError而不是一个jvm崩溃

谁能帮我弄清楚这里发生了什么事?

(注意:我最近从Eclipse 3.4.2升级到Eclipse 3.6.2,从Java 5升级到Java 6.我怀疑崩溃和这些变化之间有联系,因为我之前没有看到这些)

UPDATE

它似乎是 Java 6 Update 25中引入的一个jvm错误 ,并且与新的jit编译器有关。 另见这个博客条目。 根据博客,这个bug的修复应该是下一个Java 6更新的一部分。 与此同时,我在碰撞期间得到了本地堆栈跟踪。 我已经更新了上面的崩溃日志。

build议的解决方法,使用vm参数-XX:-DoEscapeAnalysis (至less显着降低崩溃的概率)

Solutions Collecting From Web of "Java 6 Update 25 VM崩溃:内存不足"

我偶然发现了一个类似的问题。 我们已经为我们的应用程序设置了-Xmx65536M,但一直保持着完全相同的错误。 有趣的是,这个错误总是发生在我们的应用程序实际上正在做相当轻量级计算的时候,因此远远没有达到这个极限。

我们在网上找到了一个可能的解决方案: http : //www.blogsoncloud.com/jsp/techSols/java-lang-OutOfMemoryError-unable-to-create-new-native-thread.jsp ,它似乎解决了我们问题。 在将-Xmx降低到50G之后,我们没有任何这些问题。

这个案件究竟发生了什么,对我们来说还是不太清楚。

JVM有其自身的限制,可以在达到物理或虚拟内存限制之前停止。 你需要调整的是堆大小,这与另一个-X标志是一样的。 (我认为这是像-XHeapSizeLimit这样的创意,但我会检查一下。)

在这里,我们去 :

-Xmsn指定内存分配池的初始大小(以字节为单位)。 该值必须是大于1MB的1024的倍数。 附加字母k或K表示千字节,或者m或M表示兆字节。 默认值是2MB。 例子:

  -Xms6291456 -Xms6144k -Xms6m 

-Xmxn指定内存分配池的最大大小(以字节为单位)。 该值必须是大于2MB的1024的倍数。 附加字母k或K表示千字节,或者m或M表示兆字节。 默认值是64MB。 例子:

  -Xmx83886080 -Xmx81920k -Xmx80m