Javaで「OutOfMemoryError(メモリ不足エラー)」が発生する原因は様々ですが、主に以下のような状況が関係しています:
-
ヒープメモリの不足(
java.lang.OutOfMemoryError: Java heap space
) -
メタスペース(旧パーマネント領域)の不足(
java.lang.OutOfMemoryError: Metaspace
) -
ネイティブメモリの不足
-
GC(ガベージコレクション)がメモリを開放できない
✅ 対処方法(種類別)
① ヒープメモリ不足の対処
🔧 方法1: JVMのメモリ設定を増やす
起動オプションでヒープサイズを拡張します。
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.exe
や eclipse
の隣)にあります。
✍️ 設定項目の書き方(例)
--launcher.XXMaxPermSize
256m
-vmargs
-Xms512m
-Xmx2048m
各項目の意味
設定 | 意味 |
---|---|
-Xms512m |
初期ヒープサイズ |
-Xmx2048m |
最大ヒープサイズ(←これ重要) |
✅ 注意点
-
-vmargs
の後にメモリ設定を記述すること-
それ以前に書いた内容は
Eclipse
起動引数ではなくランチャー用設定と解釈されます。
-
-
単位は
m
またはg
で指定-
例:
1024m
,2g
(大文字でも小文字でも可)
-
-
行の順序に注意
-
間違った場所に入れると無視される可能性があります。
-
✅ 反映の確認方法
-
Eclipse を再起動
-
メニュー「Help > About Eclipse > Installation Details > Configuration」で現在の JVM 引数を確認できます。
② メタスペース不足(Java 8以降)
エラー例:java.lang.OutOfMemoryError: Metaspace
🔧 方法: メタスペースサイズを増やす
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ログを有効にして挙動を確認
-verbose:gc -XX:+PrintGCDetails -Xloggc:gc.log
-
オブジェクトの生存時間や参照パターンを確認して不要なオブジェクトを早期開放する
✅ 実践的な解決ステップ
-
ログ確認(エラーメッセージの種類確認)
-
JVMオプションの調整
-
ヒープダンプ取得して分析
-
-XX:+HeapDumpOnOutOfMemoryError
-
-XX:HeapDumpPath=/path/to/heapdump.hprof
-
-
リークチェック
-
コード上で参照が残り続ける構造を疑う
-
-
キャッシュやコレクションを適切に制御
-
LRUキャッシュを使う、一定量でクリアするなど
-
あなた:
