[root@lab ~]# java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
これを修正する方法をご存知ですか?
[root@lab ~]# uname -a
Linux lab 2.6.18-194.8.1.el5.028stab070.5 #1 SMP Fri Sep 17 19:10:36 MSD 2010 x86_64 x86_64 x86_64 GNU/Linux
ここに、おそらくかなり重要な追加の詳細がいくつかあります。これはOpenVZ VPSです。
[root@lab /]# free -m
total used free shared buffers cached
Mem: 384 27 356 0 0 0
-/+ buffers/cache: 27 356
Swap: 0 0 0
最大メモリを 100 以下に設定すると JVM をロードできますが、300 MB 以上は使用可能である必要がありますか?
[root@thehacklab /]# java -Xms32M -Xmx100M -version
java version "1.6.0_0"
OpenJDK Runtime Environment (IcedTea6 1.6) (rhel-1.13.b16.el5-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
[root@thehacklab /]# java -Xms32M -Xmx128M -version
Error occurred during initialization of VM
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:614)
at java.lang.ref.Finalizer.<clinit>(Finalizer.java:194)
[root@thehacklab /]# java -Xms32M -Xmx140M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
また、Java を実行するたびに provvmpages の failcounter が増加していることに気付いたので、おそらくこれが限界に達している場所でしょう。
[root@thehacklab /]# cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10913: kmemsize 4349290 6173197 2147483646 2147483646 0
lockedpages 0 0 999999 999999 0
privvmpages 7198 98262 98304 98304 35
shmpages 671 1647 98304 98304 0
dummy 0 0 0 0 0
numproc 16 33 999999 999999 0
physpages 4411 43452 0 2147483647 0
vmguarpages 0 0 98304 2147483647 0
oomguarpages 4412 43453 98304 2147483647 0
numtcpsock 5 31 7999992 7999992 0
numflock 5 9 999999 999999 0
numpty 1 2 500000 500000 0
numsiginfo 0 4 999999 999999 0
tcpsndbuf 107352 216752 214748160 396774400 0
tcprcvbuf 81920 13351808 214748160 396774400 0
othersockbuf 6984 44232 214748160 396774400 0
dgramrcvbuf 0 8472 214748160 396774400 0
numothersock 10 27 7999992 7999992 0
dcachesize 0 0 2147483646 2147483646 0
numfile 674 1154 23999976 23999976 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 14 14 999999 999999 0
答え1
Java プログラム自体はメモリを消費します。さらに重要なのは、「PermGen」を数えるのを忘れたことです。デフォルトの perm gen サイズがいくらかはわかりませんが、128M または 256M である可能性があります。JVM に必要なヒープ サイズの合計は、PermGen + ヒープ サイズです。
スワップを追加してみてはいかがでしょうか?
また、Linux がメモリをオーバーコミットできるようにするパラメータも必要です... Google が役立つかもしれません。
答え2
私の VPS には 132M の空き容量があるため、指定できる最大ヒープ サイズは 22M です。22M から 30M の間では、さまざまなもの (pthread など) でメモリが不足し、32M を超えると「オブジェクト ヒープに十分なスペースを予約できませんでした」というエラーが発生します。-Xmn のさまざまな値も試してみましたが、結果には影響がないようです。
これらのテストには sun-java6-jre debian パッケージを使用しました。
「java -client -Xmx...」で実行してみて、より大きなメモリ サイズを使用できるかどうかを確認してください。私の VM では、java -server はまったく実行されません。