メモリ不足時の Java VM2008年09月12日 15時54分47秒

以前から何度かお目にかかったこのエラー。

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

やっと、少し掴めてきた。いや、確かに、ヒープに割り当てるメモリが足りないと出ているのは分かる。しかし、それだけでは無いようだ。

どうやって計っているのだか解らないが、どうやら実メモリにも影響されている様だ。まあ、わざわざ計っているのではなく、実装による制限の可能性もあるが。

kern.maxdsiz の影響もあるようだ。今回、kern.maxdsiz が 2GB に設定されていて、1GB しかメモリが載っていない機械で試したら、720M ぐらいまでしか拡張できない。ちなみに、swap は 2GB 取っているので、仮想メモリ空間は単純計算で、3GB に見えるはずだ。OS に因る制限はもっと下かも知れないが。

もし、kern.maxdsiz に制限されているのであれば、一つのプロセス自体には、最大 2GB までのメモリの割当てが許されているので、Java VM は問題なく起動できるはずだ。

ちなみに、観察していたところ、java プロセスは、FreeBSD 7.1-PRERELEASE 上の jdk 1.6 にて起動する時に、-Xmx で指定したメモリよりも約 120MB ぐらい余計にメモリを利用していた。恐らく、Java VM 自体が起動するのにそれだけのメモリが必要なのだろう。それから、更に -Xmx 指定分のメモリを確保する様だ。

なお、この問題に直面したら、シェルの limit (csh 系) や ulimit (sh 系) の点検も忘れずに。シェルもプロセスが割り当てられるメモリを datasize までに制限する設定がある。

前回