ホーム › ガベージコレクション(GC) › GC-02
GC-02: JVM オプション(-Xms/-Xmx/PrintGCDetails)
JVM の起動オプションでメモリサイズを設定し、GC ログを確認する方法を解説します。java.lang.management.ManagementFactory を使った プログラムからの JVM 情報取得も学びましょう。
いつ使うか
- 本番環境でヒープサイズを適切に設定したいとき(-Xms / -Xmx)
- GC が頻発していないか、GC の所要時間が長くないかを確認したいとき
- OOM(OutOfMemoryError)発生時に自動でヒープダンプを取得したいとき
- アプリケーション内部から現在のメモリ使用状況を監視・ログ出力したいとき
主要な JVM オプション
| オプション | 意味 | 備考 |
|---|---|---|
| -Xms256m | 初期ヒープサイズ | 起動直後のヒープ割当量 |
| -Xmx1g | 最大ヒープサイズ | これを超えると OOM |
| -XX:+UseG1GC | G1GC を使用 | Java 9+ のデフォルト GC |
| -XX:+UseZGC | ZGC を使用 | Java 15+ 本番対応。超低レイテンシ GC |
| -Xlog:gc* | GC ログ出力(Java 9+) | Java 8 の -XX:+PrintGCDetails の後継 |
サンプルコード
java.lang.management パッケージの ManagementFactory を使うと、GC の回数や累計時間などより詳細な JVM 情報を取得できます。-XX:+PrintGCDetails は Java 9 以降は -Xlog:gc* に変わっています。
よくあるミス・注意点
-Xms と -Xmx を同じ値にするとメモリ拡張のオーバーヘッドが減る
JVM はヒープが不足すると OS からメモリを追加確保します。この操作はコストがかかります。 本番環境では -Xms と -Xmx を同じ値に設定することで、 起動時に必要なメモリを確保し、拡張のオーバーヘッドを省けます。
-Xmx を大きくしすぎると Full GC の停止時間が増える
ヒープを大きくするとオブジェクトが長く生き残り、Full GC 発生時に膨大なオブジェクトを 一度に処理することになります。停止時間(STW: Stop-The-World)が長くなるため、 G1GC や ZGC のような低レイテンシ GC の採用もあわせて検討しましょう。
-XX:+PrintGCDetails は Java 9 以降で廃止
Java 9 から GC ログのオプションが統一形式(Unified JVM Logging)に変わりました。 Java 9 以降では -Xlog:gc* を使用してください。-XX:+PrintGCDetails は警告が出るか無視されます。
テストする観点
MemoryMXBean.getHeapMemoryUsage().getMax()が -Xmx で指定した値と一致することManagementFactory.getGarbageCollectorMXBeans()が 空でないこと(1つ以上の GC が存在すること)- 大量のオブジェクト生成後に GC 回数が増加すること
- -Xmx を小さく設定したとき、大量アロケーションで OutOfMemoryError が発生すること(境界値テスト)