[解決済み] 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などのテクニックが有用となります。
関連
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
エラーが報告されました。リソースの読み込みに失敗しました:サーバーは500(内部サーバーエラー)のステータスで応答しました。
-
コンストラクタの呼び出しは、コンストラクタのエラー理解の最初のステートメントである必要があります。
-
JQuery DataTable 详解
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
org.glassfish.jersey.servlet.ServletContainer
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
このラインで複数のマーカーを解決する方法
-
maven プラグイン エラー プラグインの実行は、ライフサイクル構成ソリューションの対象外です。