1. ホーム
  2. java

[解決済み] java.lang.OutOfMemoryError" の対処法。Java heap space "エラーの対処方法を教えてください。

2022-03-20 23:46:50

質問

私は、クライアントサイドの スイング アプリケーション (グラフィカルフォントデザイナー) を 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などのテクニックが有用となります。