2

古い Java アプリケーションで MAT( Analyzing Heap Dump ) を使用して OutOfMemory の問題をデバッグしています。MAT は、RMI スレッドが 15 万以上のインスタンスを持つマイ ビジネス オブジェクト (BO) の配列 (BO[150K+]) を作成し、約 358 MB (Xmx は 512 MB) を消費していることを示しています。メモリリークの状況です。

すべてのダンプ (サーバー クラッシュ後に作成) で気付いたもう 1 つの興味深い部分は、Array オブジェクト内のインスタンスの数が同じです。

この配列オブジェクトが作成されたクラスで、この Array Object を見つける方法を理解できません。MAT で利用可能なそのような直接/間接機能はありますか?

そのようなオプションがvisualVMまたは他のツールで利用できるかどうかを提案してください。または、コードベースで実行できるメモリアナライザー。

4

3 に答える 3

0

バニラ jVisualVM のヒープ ダンプで OQL を使用する機能があります。OQL の関数の 1 つに heap.livepaths があります。これはインスタンスをパラメーターとして受け取り、ガベージ コレクションを防止するすべてのパスを出力します。
そこにあってはならないことがわかっている具体的なクラスまたはオブジェクトがある場合 (swing のために関連するウィンドウが閉じられ、ガベージ コレクターが何度か強制された場合)、それらのパスを一覧表示し、参照パスの例をいくつか取得できます。
すべての疑わしいオブジェクトがガベージ コレクションされるまで、すすいで繰り返します。その後、リードがなくなるため、より困難になりますが、アプリにいくつかのバグが見つかり、許容できる程度に修正された可能性があります。

注: 私は通常、メモリ リークの分析に苦労していますが、非常に複雑なアプリケーションではうまくいかない場合があります。

于 2014-05-15T20:09:22.963 に答える