Centos VPS 上で Java が「ヒープ オブジェクトに十分なスペースを予約できませんでした」

Centos VPS 上で Java が「ヒープ オブジェクトに十分なスペースを予約できませんでした」
[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 はまったく実行されません。

関連情報