Trasis Inc.

渋谷拠点のシステム開発会社

OpenVZサーバでJavaを起動すると「Could not reserve enough space for object heap」エラーが発生する

概要

OpenVZ (Virtuozzo) サーバ内で Java を起動する際、メモリに余裕があるにも関わらず、以下のエラーメッセージが出力されることがある。

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

原因

アプリケーションに割り当てられるプライベートメモリの上限に引っかかっている。

root で以下のコマンドを実行する。

# cat /proc/user_beancounters
Version: 2.5
uid  resource                held          maxheld          barrier                limit      failcnt
1838:  kmemsize            33351771         47149056        215981162            237579278            0
lockedpages             9727             9727            10545                10545            0
privvmpages           410414           892808          1048576              1048576          345
shmpages               11162            11818           255834               255834            0
dummy                      0                0                0                    0            0
numproc                  115              198             5272                 5272            0
physpages             216325           429549                0              1048576            0
vmguarpages                0                0           524288               524288            0
oomguarpages          100958           257789           426391  9223372036854775807            0
numtcpsock                56               79             5272                 5272            0
numflock                   3               15             1000                 1100            0
numpty                     4                4              160                  160            0
numsiginfo                 0               51             1024                 1024            0
tcpsndbuf             629496          1823912          5039960              7199372            0
tcprcvbuf            1024856          2261032         50399608             71993720            0
othersockbuf          174424           321944          2519980              4679391            0
dgramrcvbuf                0            26456         25199804             25199804            0
numothersock             194              224             5272                 5272            0
dcachesize          16874504         32772941         47171603             48586752            0
numfile                 1404             1775            84352                84352            0
dummy                      0                0                0                    0            0
dummy                      0                0                0                    0            0
dummy                      0                0                0                    0            0
numiptent                 38               38              200                  400            0

ここで、privvmpages 行の failcnt 値が上昇していることが確認できる。
各パラメータの意味は 【OpenVZ】リソース パラメータ が詳しい。

[VPS] Virtuozzoのメモリはfreeやtopでなくてprivvmpagesを見るべし を参考に、使用できるメモリ量を確認すると、

beans=`cat /proc/user_beancounters | grep priv`
max=`echo $beans | awk '{ print $4;}'`
use=`echo $beans | awk '{ print $2;}'`
let "per=$use*100/$max"
let "mb=$use/256"
let "mmb=$max/256"
echo "privvmpages usage: $mb MB ($per% of $mmb)"

このサーバの場合は

privvmpages usage: 1606 MB (39% of 4096)

となった。

対策

その1: Java の使用メモリを減らす

Java の起動オプションで

java -Xmx1024m -Xms512m

の箇所を調整する。

その2: VPS の privvmpages 値を増やす

レンタル VPS サーバではなく自前で VPS サーバを立ち上げている場合、設定ファイルで privvmpages 値を増やすことができる。
詳細は OpenVZ VPS and Java Memory Error and how to fix it を参照。

参考文献