メモリ不足時の 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 までに制限する設定がある。

前回

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

名前:
メールアドレス:
URL:
コメント:

トラックバック

このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2008/09/12/3757257/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。