現在、Javaの実行に問題があります。ヒープの問題が原因で開始されません。しかし、私は9 GBを超えるRAMを解放しています(キャッシュが空であると想定している場合は16 GBです)。これは私が受け取るエラーです(そしてfree
コマンド)
root@server: ~ # Java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
root@server: ~ # free
total used free shared buffers cached
Mem: 25165824 15941148 9224676 0 0 7082176
-/+ buffers/cache: 8858972 16306852
Swap: 0 0 0
仮想サーバーで64ビットDebianを実行しています。仮想化ソフトウェアはOpenVZです。これは私のJavaバージョンです(VMのうち2つ(現在実行中の4つ)を停止した後でこのコマンドを実行できます)):
root@server: ~ # Java -version
Java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
私は何ができますか?
要求どおり:
root@server: ~ # cat /proc/meminfo
MemTotal: 25165824 kB
MemFree: 11723412 kB
Cached: 4597552 kB
Active: 9692308 kB
Inactive: 3322544 kB
Active(anon): 7411960 kB
Inactive(anon): 1005340 kB
Active(file): 2280348 kB
Inactive(file): 2317204 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 960 kB
Writeback: 0 kB
AnonPages: 8417300 kB
Shmem: 21504 kB
Slab: 427452 kB
SReclaimable: 383424 kB
SUnreclaim: 44028 kB
Reguest2:
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10023468: kmemsize 399250512 506245120 5053325720 5558658292 0
lockedpages 0 8 246744 246744 0
privvmpages 6005602 6291447 6291456 6291456 221
shmpages 8576 8608 579124 579124289562 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 598 1236 30000 30000 0
physpages 4634494 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529371 2144671 6291456 9223372036854775807 0
numtcpsock 62 164 30000 30000 0
numflock 25 39 1000 1100 0
numpty 13 24 512 512 0
numsiginfo 10 75 1024 1024 0
tcpsndbuf 3330352 4153232 1179110194 1684441906 0
tcprcvbuf 1216896 34410032 1179110194 1684441906 0
othersockbuf 270504 537552 589555096 1094886808 0
dgramrcvbuf 0 67048 589555096 589555096 0
numothersock 287 333 30000 30000 0
dcachesize 355559855 446054103 1103879952 1136996352 0
numfile 4766 7745 250000 250000 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 14 14 1000 1000 0
root@server: ~ # Java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10023468: kmemsize 399246622 506245120 5053325720 5558658292 0
lockedpages 0 8 246744 246744 0
privvmpages 6005601 6291447 6291456 6291456 233
shmpages 8576 8608 579124 579124289562 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numproc 598 1236 30000 30000 0
physpages 4635460 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529376 2144671 6291456 9223372036854775807 0
numtcpsock 64 164 30000 30000 0
numflock 25 39 1000 1100 0
numpty 13 24 512 512 0
numsiginfo 10 75 1024 1024 0
tcpsndbuf 3365232 4153232 1179110194 1684441906 0
tcprcvbuf 1249664 34410032 1179110194 1684441906 0
othersockbuf 270504 537552 589555096 1094886808 0
dgramrcvbuf 0 67048 589555096 589555096 0
numothersock 287 333 30000 30000 0
dcachesize 355559855 446054103 1103879952 1136996352 0
numfile 4768 7745 250000 250000 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
dummy 0 0 9223372036854775807 9223372036854775807 0
numiptent 14 14 1000 1000 0
failcnt
がprivvmpages
で起動中のため、コンテナーはホストから仮想メモリ空間をこれ以上割り当てることができません。
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
privvmpages 6005601 6291447 6291456 6291456 >233<
physpages 4635460 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529376 2144671 6291456 9223372036854775807 0
仮想メモリ !=物理メモリであることに注意してください。プロセスは、仮想メモリのアドレス可能な量の周りのどこかまで割り当てる(32ビット〜2G-4G、64ビット8)TB -256 TB)は、物理メモリページが使用されていることを意味しません(ページは4KBのメモリチャンクです)。
physpages
は、コンテナーが使用できる物理メモリページの数です。oomguarpages
は、ホストがメモリに制約がある場合にコンテナが受け取る保証されたメモリページです。privvmpages
は、コンテナが使用できる仮想メモリページの数ですvmguarpages
は、同様に仮想メモリの保証量です
Oracle Javaは常に仮想メモリの連続した1つのチャンクを割り当てます。ボックスで引数なしでJava
を実行すると、5Mの実メモリが使用されます(RSS
)が、VM割り当てられたスペース(VSZ
):
PID COMMAND VSZ RSS
20816 Java 667496 4912
Java
ファイルのsmaps
プロセスのメモリセグメントを見ると、約500MBのチャンクが割り当てられており、残りはメモリマップファイルであり、通常のJavaものです。
しばらく稼働しているシステムでは、利用可能なVMスペースは、プロセスがその一部を使用/解放するにつれて断片化します。Agrep Vmalloc /proc/meminfo
は、現在利用可能な最大の空きチャンクであるVmallocChunk
を提供します。これが低い場合、システムは、Java
が要求したときに、64ビットボックスで事実上無制限であるため、さらに多くを割り当てようとします。
ホストにprivvmpages
とvmguarpages
をはるかに高く設定するように伝えます。それらが物理メモリと同じである必要はありません。それは方法に影響を与えるためです linux memory works
ファイルキャッシュを削除すると、一時的に問題を回避できる可能性がありますecho 1 > /proc/sys/vm/drop_caches
しかし、それは一時的なものです。
メモリのチャンクを制限することができますJava
は、実行時に最小のXms
で、または最大のXmx
で実行中に割り当てを試みます。私のマシンでこれらのオプションを使用してJava
を実行します。
Java -Xms10M -Xmx10M
Javaヒープに割り当てられたヒープに10MBの連続したチャンクのみを使用して、合計仮想サイズを140MB程度に減らします。
私たちの場合、VMが起動時に予約しようとするヒープサイズを制限するのに役立ちました。
たとえば、コマンドラインで:
export _Java_OPTIONS = '-Xms64M -Xmx128m'
またはTomcatの場合は[Tomcat_HOME] /bin/setenv.sh
#!/ bin/sh
Java_OPTS = "-Xms64M -Xmx256M"
(コマンドラインの余分な先行アンダースコアに注意してください。)
プロバイダーの説明は次のとおりです。
おそらく、デフォルトのJavaヒープサイズを変更する必要があります。次の引数を試してください:
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set Java thread stack size
例えば:
Java -Xms64m -Xmx1512m
これ thread は役立つかもしれません
また、ulimitを確認します(ulimitは、シェルおよびシェルによって開始されたプロセスで使用可能なリソースを制御します)。
ulimit -a
仮想メモリが不足している可能性があります。
RAM使用(または不足)に焦点を当てていますが、既存のJVMはRAMではなく仮想メモリを予約しています。予約されたメモリのページにアクセスしない限り、RAM使用状況が報告されました。
Linuxは通常、オーバーコミットメント設定によってこの問題を覆っていますが、OSレベルの仮想化環境で実行しているという事実は、オーバーコミットメントを減らす/無効にするか、仮想メモリリソース制御キャッピングを設定する可能性があります。
通常のOSインスタンス(コンテナではない)では、これを回避する最も簡単な方法は、予約済みメモリがRAMを浪費しないようにスワップを追加することです。コンテナーでは、問題を克服する方法として、グローバルに利用可能な仮想メモリーを増やす必要があるかもしれませんが、より一般的には、コンテナーにより多くの仮想メモリーを付与することで簡単に実行できます。