web-dev-qa-db-ja.com

Java 6 Update 25 VMクラッシュ:メモリ不足

この質問の更新については、以下を参照してください。

(少なくとも私にとっては再現可能な)jvm crashOutOfMemoryErrorではない)を経験します(クラッシュするアプリケーションは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のRAMがあります。アプリケーションを起動する前に、タスクマネージャーによると2 GBの空き容量がありました(+1 GBのシステムキャッシュも解放される可能性があります)。 )私は間違いなく十分な空きRAMを持っています。

最初からクラッシュするまで、visualvmとjconsoleを使用してjvmメモリ統計をログに記録しました。クラッシュする直前までのメモリ消費統計を取得しました。

統計は、次の割り当てられたメモリサイズを示しています。

  • HeapSize:751 MB(248 MBを使用)
  • Non-HeapSize(PermGen&CodeCache):150 MB(95 MBを使用)
  • メモリ管理領域のサイズ(Edenspace、Old-genなど):50 MB
  • スレッドスタックサイズ:17 MBOracle によると、51のスレッドが実行されているため)

次のパラメータを使用してアプリケーション(jre 6 update 25、server vm)を実行しています。

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

質問:

  • VMとOSに明らかに十分なメモリがあるのに、なぜjvmがクラッシュするのですか?
    上記の設定では、2GBの32ビット制限(1124MB + 192MB + 96MB +スレッドスタック<2GB)に達することはできないと思います。それ以外の場合(ヒープ割り当てが多すぎる)は、jvmのクラッシュよりもOutOfMemoryErrorを期待します

ここで何が問題になっているのかを理解するのを誰が助けてくれますか?

(注:最近、Eclipse3.4.2からEclipse3.6.2にアップグレードし、Java 5からJava 6。に接続していると思われます。クラッシュとこれらの変更、これまで見たことがないため)

[〜#〜] update [〜#〜]

jvmのバグのようですJava 6 Update 25で導入され、新しいjitコンパイラと関係があります。参照 このブログエントリ。 ブログによると、このバグの修正は次のJava 6アップデートの一部になるはずです。その間に、ネイティブスタックトレースを取得しましたクラッシュ中上記のクラッシュログを更新しました。

Vm引数を使用して提案された回避策-XX:-DoEscapeAnalysis動作します(少なくとも、クラッシュの可能性が大幅に低下します)

20
MRalwasser

私は職場で同様の問題に遭遇しました。アプリケーションに-Xmx65536Mを設定しましたが、まったく同じ種類のエラーが発生し続けました。面白いことに、エラーは、アプリケーションが実際にかなり軽量な計算を行っていたときに常に発生し、比較的言えば、この制限にはほど遠いものでした。

オンラインで問題の可能な解決策を見つけました: http://www.blogsoncloud.com/jsp/techSols/Java-lang-OutOfMemoryError-unable-to-create-new-native-thread.jsp 、そしてそれは私たちの問題を解決したようでした。 -Xmxを50Gに下げた後、これらの問題は発生していません。

この事件で実際に何が起こっているのかは、私たちにはまだやや不明確です。

1
jesseniem