【Java】outofmemoryエラーが出たときにメモリサイズを見直す方法

Javaで「OutOfMemoryError(メモリ不足エラー)」が発生する原因は様々ですが、主に以下のような状況が関係しています:

  • ヒープメモリの不足(java.lang.OutOfMemoryError: Java heap space

  • メタスペース(旧パーマネント領域)の不足(java.lang.OutOfMemoryError: Metaspace

  • ネイティブメモリの不足

  • GC(ガベージコレクション)がメモリを開放できない


✅ 対処方法(種類別)


① ヒープメモリ不足の対処

🔧 方法1: JVMのメモリ設定を増やす

起動オプションでヒープサイズを拡張します。

bash
java -Xms512m -Xmx2048m -jar yourApp.jar
  • -Xms: 初期ヒープサイズ

  • -Xmx: 最大ヒープサイズ(ここが不足してると OOM 発生)

例: メモリ上限を2GBにしたい場合 → -Xmx2g

🔧 方法2: メモリリークを特定して修正

  • ツール利用例:

    • VisualVM

    • Eclipse Memory Analyzer Tool (MAT)

    • JProfiler

    • YourKit

  • ポイント:

    • 使い終わったオブジェクトが参照されたままになっていないか確認

    • キャッシュ(Map, Listなど)や ThreadLocal に注意

eclipse.ini におけるヒープサイズ設定方法

📁 ファイルの場所

通常、eclipse.ini は Eclipse 本体と同じディレクトリ(eclipse.exeeclipse の隣)にあります。


✍️ 設定項目の書き方(例)

ini
--launcher.XXMaxPermSize
256m
-vmargs
-Xms512m
-Xmx2048m

各項目の意味

設定 意味
-Xms512m 初期ヒープサイズ
-Xmx2048m 最大ヒープサイズ(←これ重要)

✅ 注意点

  1. -vmargsの後にメモリ設定を記述すること

    • それ以前に書いた内容は Eclipse 起動引数ではなくランチャー用設定と解釈されます。

  2. 単位は m または g で指定

    • 例:1024m, 2g(大文字でも小文字でも可)

  3. 行の順序に注意

    • 間違った場所に入れると無視される可能性があります。

✅ 反映の確認方法

  1. Eclipse を再起動

  2. メニュー「Help > About Eclipse > Installation Details > Configuration」で現在の JVM 引数を確認できます。


② メタスペース不足(Java 8以降)

エラー例:java.lang.OutOfMemoryError: Metaspace

🔧 方法: メタスペースサイズを増やす

bash
java -XX:MaxMetaspaceSize=512m -jar yourApp.jar
  • クラスを大量にロードしすぎている場合に発生

  • SpringやJSPなどの動的クラス生成に注意


③ ネイティブメモリ不足(Direct ByteBufferなど)

エラー例:java.lang.OutOfMemoryError: Direct buffer memory

🔧 方法:

  • -XX:MaxDirectMemorySize=256m を指定して制御

  • NettyなどのライブラリがDirectBufferを使う場合に発生しやすい


④ GCループによるメモリ不足

GCが頻繁に起こり、使えるメモリが確保できずに終了するケース。

🔧 方法:

  • GCログを有効にして挙動を確認

bash
-verbose:gc -XX:+PrintGCDetails -Xloggc:gc.log
  • オブジェクトの生存時間や参照パターンを確認して不要なオブジェクトを早期開放する


✅ 実践的な解決ステップ

  1. ログ確認(エラーメッセージの種類確認)

  2. JVMオプションの調整

  3. ヒープダンプ取得して分析

    • -XX:+HeapDumpOnOutOfMemoryError

    • -XX:HeapDumpPath=/path/to/heapdump.hprof

  4. リークチェック

    • コード上で参照が残り続ける構造を疑う

  5. キャッシュやコレクションを適切に制御

    • LRUキャッシュを使う、一定量でクリアするなど

 
あなた:
管理人
Javaの記事の一覧はJava にまとめてあります

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP