OpenVZ上で動くLinuxでJavaを動かす際の罠
QuickVPSの管理者の方にお願いして割り当てメモリの多いプランに変更して頂くも、JavaのVMがメモリ不足で立ち上がらない現象は変わらず。
なんでだろーと思いつつ考えつつTerminal眺めていたら
# java -Xmx64m -version java version "1.5.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03) Java HotSpot(TM) Server VM (build 1.5.0_10-b03, mixed mode)
ん?
Java HotSpot(TM) Server VM (build 1.5.0_10-b03, mixed mode)
Server VM!!そうだ!JavaのVMって1種類じゃないことを思い出しました!
んでSunのページを彷徨いた所、原因らしき物を発見。
Oracle Technology Network for Java Developers
こいつのせいか!!
OpenVZで自分の領域に割り当てられてるのは128MBとかですが、top コマンド等でステータス表示すると
Mem: 4105920k total, 4067940k used, 37980k free, 273812k buffers Swap: 2401592k total, 592k used, 2401000k free, 2566428k cached
とか明らかにホスト側の量で認識されてるし・・・
そして Server VM は激しくメモリを確保なさるそうなので、そこでメモリの確保にこけてる感じですね。
と言うわけでその前提を元にGoogle先生におききしつつ世界を旅してみたら
OpenVZ Forum: Support » *SOLVED* Java: Could not reserve enough space for object heap
なるスレッドを発見。
なるほどねー、Server VM を消してClient VM にシンボリックリンク張っちゃうのか・・・
なんつー力業。 (;´-`)=3
と言うわけでやってみよー。
まずは中途半端に入ってるJRE 5.0を綺麗さっぱり消して、もう一度JDKのインストールを前の apt-get と同じ要領でやります。
# apt-get install sun-java5-jdk sun-java5-demo sun-java5-source sun-java5-doc sun-java5-plugin sun-java5-fonts
で、例によってこけますがとりあえず無視。
手元のDebian Etchだと
/usr/lib/jvm/java-1.5.0-sun/jre/lib/i386
に目的のVM君達が居ました。
そこで
# mv server server.original # ln -s client server
しました、javaコマンド動くかな・・・
# java -version java version "1.5.0_10" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03) Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode)
きたー!!! (`・ω・´)
というわけで途中でこけてる apt-get をもっかい走らせます。
# apt-get upgrade ・・・ sun-java5-bin (1.5.0-10-3) を設定しています ... Could not create the Java virtual machine. dpkg: sun-java5-bin の処理中にエラーが発生しました (--configure): サブプロセス post-installation script はエラー終了ステータス 1 を返しました
駄目だ (ノ−o-)ノ ┸┸)`3゚)・;'.
と言うわけで諦めるには悔し過ぎるので色々調べたら
/var/lib/dpkg/info/sun-java5-bin.postinst
というファイルが apt-get で実行されてるスクリプトの様です。
こいつの先頭部分で set -x してやるとtraceが出るのでやってみました。
setコマンドの詳細は
に載ってます。
んで、早速やってみたところ
# apt-get upgrade ・・・ + /usr/lib/jvm/java-1.5.0-sun-1.5.0.10/bin/java -client -Xshare:dump Could not create the Java virtual machine.
こいつか!!
-Xshare:dump ってなんだ・・・?と思い調べてみると
Oracle Technology Network for Java Developers
ぅぉ、こんな事してたんだ・・・しらんかった orz
そして説明を読む限り、起動パフォーマンスを犠牲にしてもOKならばしなくても大丈夫そうですね。
と言うわけで postinst ファイルから該当行をコメントアウトすればいけそう。