今時 32bit JVM なんてないわー
JVMを 32bitから64bitに変更すると、同じアプリでも permGenSpace (permenent 領域)の要求量が増えます。この領域を使い切ると Eclipse でおなじみ OutOfMemoryError: PermGen space
で GC 祭りとなり、固まります。泣きたい。
普通は設計を大幅に見直さない限り permanent 領域の容量は減らせませんので、対策は permenent 領域の割当を引き上げてやるしかありません。
割当は java 起動時の -XX:MaxPermSize
オプションで変更可能です。Oracle 公式の Java Hotspot VM Options によりますと...
-XX:MaxPermSize=64m
Size of the Permanent Generation. [5.0 and newer: 64 bit VMs are scaled 30% larger; 1.4 amd64: 96m; 1.3.1 -client: 32m.]
java5 以降の 64bit VM ではデフォルトで 32bit時の 30%増し、つまり約 83MB まで拡張されることになっているそうですが…うーん。今回は実測ベースで約 55MB で推移してたものが 83MB 使い切って溢れたのですよ。 30% 増しじゃ足りませんがな。
まぁ、同時にJavaのバージョンも上げてるので深くは追求するまい。
今回はメモリに余裕のあるマシンだったので富豪的に
-XX: MaxPermSize=256m
を起動オプションに追加して乗り切ることにしました。設定が入ったかどうかの確認は
% jmap -heap <PID> | grep MaxPermSize
MaxPermSize = 268435456 (256.0MB)
でやるのがよろしいかと。
(以下、蛇足)
Java 6 以降ではヒープサイズ 32GB 以下の場合には 32bit ポインタを使う(-XX:+UseCompressedOops 有効) が、 Java5 ではつねに 64bit ポインタが使われてしまうため、特に消費増が顕著とか。いまから Java5 に乗り換える人はいないでしょうが、そんな情報もありました、と言うことで。