私は、複数のモジュールを使用して Java でこのプロジェクトに取り組んできました。かなり前から、「java: Out Of Memory」エラーが発生することがあります。私はこの「人気のある」エラーにかなり慣れていないので、そのようなエラーを解決するための一般的なアプローチを知りたいと思っていました.
また、このようなエラーの原因を突き止めるのに役立つ、業界で受け入れられている標準ツールはありますか?
私のプロジェクトのモジュールには、サードパーティからの毎分のポーリング(Web サービスを使用)、とりわけマルチスレッドが含まれています。ただし、これは単なるポインターであり、プロジェクトに固有のものではなく、一般的なアプローチを求めています。
ありがとう。
5 に答える
大量のメモリを使用するクラスがあり、ヒープ サイズを増やすか、よりスペース効率の良いアルゴリズムを作成する必要がある場合があります。また、リークであり、オブジェクトを参照する必要がある場合もあります。
- 実行します
jvisualvm
(JDK に含まれています)。 - プロセスに接続し、ヒープ サイズを監視しながらメモリ不足エラーを再現できるかどうか試してください。
- メモリが大きくなったときにヒープ ダンプを実行します。サイズで最大のオブジェクトを検索します。多くの場合、犯人クラスが得られます。
- 依存関係を調べて、参照を保持しているものを確認します。メモリ リークの場合は、不要なオブジェクトを逆参照してください。
また、このようなエラーの原因を突き止めるのに役立つ、業界で受け入れられている標準ツールはありますか?
はい、 VisualVMやYourKitなどのメモリ プロファイラがあります。私は後者を CPU とメモリの両方のプロファイリングに広く使用していますが、非常に便利です。それができることのいくつかのアイデアを得るには、このページを見てください:リンク.
使用可能なメモリを増やすことができない場合は、消費量を減らす必要があります。
実行時に不要なオブジェクト (動的にリロードできるデータなど) への参照を保持しないでください。必要に応じてフローを再設計します (たとえば、すべてのオブジェクトを並行して処理せず、順番に実行するなど)、必要なものを少なくします。その時の記憶。ガベージ コレクションが残りの処理を行います。
特に、ビッグ データ オブジェクトをメモリに読み込む場合は、可能であればストリーミング アプローチの使用を検討してください。たとえば、ファイル全体を検索する場合、ファイル全体をメモリにロードする必要はありません。あなたはただそれを通り抜けることができます。
アーキテクチャの問題に加えて、リークも発生する可能性があります。不要になったオブジェクトへの意図しない参照を保持することです。それらは参照されているため、ガベージ コレクターはメモリを解放できず、ある時点でメモリが不足します。これがおそらく OutOfMemoryExceptions の最大の理由であり、通常はstatic
クラス以降の参照に関係しているため、最初にクラスに触れた後static
は通常、 s はアンロードされません。インターネットには、それらを見つけて修正する方法に関する多くの記事があります。たとえば、How to Fix Memory Leaks in Java
私が知っている 1 つのツールはMATです
OOM が頻繁に発生する場合は、正しいオプションで Java を起動し、ヒープ ダンプを取得して jhat または Eclipse のメモリ アナライザー (http://www.eclipse.org/mat/) で分析します。
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>
メモリ リークが発生している可能性があります。それを見つけることは挑戦です。Netbeans には、VM のプロファイリングに役立つツールがいくつかあります。プロジェクトのプロファイルを作成し、実行中に男性の使用状況を表示できます。Apache JMeter はプラグインとしても利用できますが、単独で実行することもできます。JMeter.apache.org