LoginSignup
3
4

More than 5 years have passed since last update.

JVMを32bitから64bitに変更する時はpermGenSpace消費増に注意

Posted at

今時 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 に乗り換える人はいないでしょうが、そんな情報もありました、と言うことで。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4