Emotion Wave Tech Blog

福岡にあるエモーションウェーブ株式会社のエンジニアが書いています。

JVMヒープサイズのデフォルト値は?

java.lang.OutOfMemoryError

Javaアプリケーション運用中に結構な確立で遭遇してしまうエラーです。
どこの現場行っても対応しているような気がします。。

メモリ設計、パフォーマンスを意識したコーディング、大事です。
しかし、運用開始後にはいつも想定外の出来事が発生するもの。

ある程度の規模のシステムであれば、
使用するJVMのヒープサイズをアプリ起動時に適切に設定します。
Webアプリケーションであれば、TomcatWeblogic等の起動オプション。
(-Xms, -Xmxをオーバーライドして設定)

先日、ヒープサイズを設定してない場合のデフォルト値は
どうなるんだっけ?という話がでたので調べてみました。

JVMヒープサイズのデフォルト値
J2SE 5.0以前
初期値:2MB
最大値:64 MB

J2SE 5.0以降
初期値:物理メモリの 1/64
最大値:物理メモリの 1/4(上限1GB)
(物理メモリが1GBより小さい場合、最大値は物理メモリの1/2)
http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

どうやらJ2SE5前後で異なるようです。
上記の最大値を超えるとOutOfMemoryErrorが発生します。
(※JVM自体が使用する領域もあるので実側すると最大値よりちょっと少なめでした)

OutOfMemoryError発生時は、現状の設定値調査が必要ですので、
上記の内容を覚えておくと役立つことがあるかなと思います。

追記:
起動中のJVMの使用状況を確認する場合は、起動時のオプションに
「-verbose:gc」や「-XX:+PrintGCDetails」を指定してログ出力します。
個人的には詳細が確認できる「-XX:+PrintGCDetails」を使用します。