少し古いバージョンのEclipseをセットアップして実際にコーディングしていると1日に何回も落ちるという自体になってしまったので、その時に対応した内容をメモしておきます。
環境
- Eclipse 3.4
- Windows7 professional 32bit版
対処方法
- eclipse.iniファイルの「-Xms」と「-Xmx」の設定値を大きくする。
12-Xms512m-Xmx512m
-Xms:eclipse 起動時に確保するメモリ量
-Xmx:eclipse が使用する最大のメモリ量 - eclipse.iniファイルへクラスファイルをメモリ上にロードするための領域となる「パーマネント領域」のサイズを設定する。
12-XX:PermSize=512m-XX:MaxPermSize=512m
-XX:PermSize:eclipse 起動時に確保するパーマネント領域のサイズ
-XX:MaxPermSize:eclipse が使用するパーマネント領域の最大サイズ - JUnitなどでのテスト時のメモリ領域を確保するためVM引数を設定する。
メニューの「実行」⇒「デバッグの構成」⇒「引数」タブを選択して以下の様に設定します。
1-server -Xmx512m -Xms512m -XX:MaxPermSize=512m
補足・注意点
PermGen → Metaspace への移行(Java 8 以降)
-
Java 8 以降では、JVM は PermGen を廃止し、代わりに Metaspace(メタスペース) を使います。
→ そのため-XX:PermSize / -XX:MaxPermSize
の指定は Java 8 以降の環境では無効、あるいは効果が薄いことがあります。 -
Metaspace に対しては
-XX:MaxMetaspaceSize
オプションを使って上限を設定できます(必要なら)。 -
したがって、Eclipse や実行対象の JVM が Java 8 以降であれば、PermGen 設定は不要という理解が必要です。
ヒープサイズ増加にも限界あり
-
-Xmx
を極端に大きく設定するのは注意が必要です。OS やマシンの物理メモリ量、他プロセスとの兼ね合いにより、JVM が確保できないことがあります。 -
メモリを大きくしても、メモリリークや不要オブジェクトの参照、GC 調整の問題が残っていれば OOM(OutOfMemoryError)は解消しないことがあります。
-
Eclipse 自体が消費するメモリ以外に、ワークスペースやプラグイン、ビルド・デバッグ時の負荷も考慮する必要があります。
GC(ガベージコレクション)設定の見直し
-
GC パラメータ(例:
-XX:+UseG1GC
、-XX:+UseConcMarkSweepGC
、-XX:NewRatio
など)を試すのも手です。 -
特に大規模プロジェクトや多数のプラグインを使っている場合、GC が頻繁に走って性能を圧迫し、最終的に OOM に至る可能性があります。
-
GC ログを有効化して、GC の挙動(頻度、時間、フル GC の発生など)を分析するのが望ましいです。例:
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:<file>
。
Eclipse のプラグイン/構成の見直し
-
不要なプラグインや拡張を無効化またはアンインストールすることで、Eclipse 自体のメモリ使用量を抑える。
-
ワークスペースで扱っているプロジェクトの数やファイル数を整理する。巨大なワークスペースをひとまとめに使うと、Eclipse の管理コストが上がります。
-
ビルド自動化や同期系プラグイン(例えば自動インデックス化、リアルタイム補完など)を軽めに設定する。
別プロセス化・分割・モジュール化
-
大きなプロジェクトを分割し、小さなモジュール単位で扱うことで、Eclipse が一度に扱うクラス数やリソースを抑える。
-
ビルドやテスト、実行を Eclipse 外(Gradle/Maven/コマンドライン)で行い、Eclipse は編集とデバッグに専念させる。
モニタリングとプロファイリング
-
VisualVM、JConsole、YourKit、Eclipse MAT(Memory Analyzer Tool)などを使い、ヒープダンプを取得・分析し、どのオブジェクトが残留しているかを調べる。
-
メモリリークや大きなキャッシュが残っていないか、長時間使っているとどのオブジェクトが増えていくかを可視化すると、特定部位の改善が可能。
最新版 Eclipse / JVM への更新
-
元記事は Eclipse 3.4 という古いバージョンを想定しています。現在使っている Eclipse のバージョン、JDK のバージョンが古ければ、メモリ管理などが非最適なままということもあります。
-
Eclipse や JDK を最新版または安定版にアップデートすることで、メモリ管理の改善やバグ修正が反映されている可能性があります。
OS・ハードウェア依存の問題
-
OS 側でプロセスあたりのメモリ制限(特に 32bit OS や 32bit JVM 環境)を意識する必要があります。32bit だとヒープサイズに上限があります。
-
他のプロセス(例えば Web ブラウザ、IDE、DB サーバーなど)がメモリを大量に使っていると、Eclipse に割り当てられる余裕が減ります。
特定例:「Metaspace が足りない」エラーや GC オーバーヘッド
-
java.lang.OutOfMemoryError: Metaspace
のようなエラーが出るなら、-XX:MaxMetaspaceSize
の調整 -
java.lang.OutOfMemoryError: GC overhead limit exceeded
のようなエラーなら、GC チューニング(拡張ヒープ、GC パラメータ、若年世代と年長世代の比率変更など)を検討。