[解決済み] java.lang.OutOfMemoryError" の対処法。Java heap space "エラーの対処方法を教えてください。
質問
私は、クライアントサイドの
スイング
アプリケーション (グラフィカルフォントデザイナー) を
Java 5
. 最近、私は
java.lang.OutOfMemoryError: Java heap space
というエラーが発生します。これは、メモリの使用量を控えめにしていないためです。ユーザーは無制限にファイルを開くことができ、プログラムは開いたオブジェクトをメモリに保持します。簡単な調査の後、私は以下を見つけました。
5.0 Java 仮想マシンの人間工学
Windowsマシンでは、JVMのデフォルトの最大ヒープサイズは次のようになるとのことです。
64MB
.
このような場合、この制約をどう処理すればよいでしょうか。
を増やすことができました。 最大ヒープサイズ を使って コマンドライン というオプションがありますが、そのためには利用可能な RAM を調べたり、起動プログラムやスクリプトを書いたりする必要があります。その上、いくつかの 有限 最大値ではありません。 究極的には が解消されます。
私のコードの一部を書き換えて、オブジェクトを頻繁にファイルシステムに保存するようにすれば(データベースを使うのも同じこと)、メモリを解放することができます。うまくいくかもしれませんが、それもおそらく大変な作業でしょう。
上記のアイデアの詳細、または以下のような代替案をご教示いただければ幸いです。 仮想メモリの自動生成、ヒープサイズの動的な拡張 ということです。
解決方法は?
結局のところ、どのようなプラットフォームで動作していても、使用できるヒープには限りがあります。Windows 32ビット版では、以下のようになります。
2GB
(特にヒープではなく、プロセスごとのメモリの総量)。たまたまJavaはデフォルトを小さくすることにしたのです(おそらく、プログラマがこの問題にぶつかることなく、メモリ割り当てが暴走するようなプログラムを作れないように、そして、彼らが何をしているかを正確に調べなければならないようにするためです)。
このように、必要なメモリ量を決定する、あるいは使用しているメモリ量を削減するためには、いくつかのアプローチが考えられます。JavaやC#のようなガベージコレクションの言語でよくある間違いの1つは、自分が使っているオブジェクトへの参照を保持し続けることです。 もはや を使用したり、多くのオブジェクトを割り当てることができます。 <強い 再利用 を使用します。オブジェクトに参照がある限り、ガベージコレクタはオブジェクトを削除しないので、オブジェクトはヒープスペースを使い続けることになります。
この場合、Javaのメモリプロファイラを使って、プログラムのどのメソッドが大量のオブジェクトを割り当てているかを調べ、それらがもう参照されないようにする方法、またはそもそも割り当てないようにする方法があるかどうかを判断することができます。私が過去に使用したことのあるオプションの1つは、"JMP"です。 http://www.khelekore.org/jmp/ .
もし、これらのオブジェクトが何らかの理由で割り当てられ、参照を維持する必要があると判断した場合(何をするかによりますが)、プログラムを開始するときに最大ヒープサイズを大きくすればよいでしょう。しかし、一度メモリプロファイリングを行い、オブジェクトがどのように割り当てられているかを理解すれば、必要なメモリ量についてより良いアイデアを得ることができるはずです。
一般に、プログラムがある有限のメモリ量(おそらく入力サイズに依存する)で実行されることを保証できない場合、常にこの問題に直面することになります。この問題をすべて解決した後に初めて、オブジェクトのディスクへのキャッシュなどを検討する必要があります。この時点で、何かにXgbのメモリが必要で、アルゴリズムやメモリ割り当てパターンを改善しても回避できない、という非常に正当な理由があるはずです。一般的に、これは大規模なデータセットで動作するアルゴリズム(データベースや科学的分析プログラムなど)の場合に限られ、キャッシュやメモリマップドIOなどのテクニックが有用となります。
関連
-
[解決済み] プロトコルハンドラの初期化に失敗しました。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
-
[解決済み] java.lang.OutOfMemoryError "に対処する。PermGen space "エラーに対処する
-
[解決済み] エラー java.lang.OutOfMemoryError: GCオーバーヘッドの制限を超えました
-
[解決済み】オブジェクトヒープに十分なスペースを確保できませんでした。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javaで拡張子なしのファイル名を取得する方法は?
-
[解決済み] ストリングビルダー.イコール Java
-
[解決済み] JavaでFileFilterを作るには?
-
[解決済み] java.lang.IncompatibleClassChangeError: Mongo クラスを実装しています。
-
[解決済み] 型の不一致:ArrayListからListへの変換ができない
-
[解決済み] JavaにおけるMouseListenerとMouseAdapterの違いについて
-
[解決済み] Java- <T extends Comparable<T>>の意味?
-
[解決済み] アクティビティに割り当てられない
-
[解決済み] 文字列の長さに応じて文字列をトリミングする
-
[解決済み] init-paramとcontext-param