4

Javaヒープダンプファイル(jmapによって作成された)を解析および分析するプログラム(できればjavaで)を作成したいと思います。すでにそうしている素晴らしいツール(jhat、eclipseのMATなど)がたくさんあることは知っていますが、アプリケーションの特定の観点からヒープを分析したいと思います。

ヒープダンプファイルの構造、読み取り方法の例などについては、どこで読むことができますか?それを検索するのに役立つものは見つかりませんでした...

どうもありがとう。

4

2 に答える 2

3

Eclipseバージョンでは次のことが行われました:Luna Service Release 1(4.4.1)およびEclipseMemoryAnalyzerバージョン1.4.0

Javaヒープダンプとのプログラムによるインターフェース

環境設定

  1. Eclipseで、[ヘルプ]->[新しいソフトウェアのインストール]->[Eclipseプラグイン開発環境のインストール]
  2. Eclipseでは、[ウィンドウ]->[設定]->[プラグイン開発]->[ターゲットプラットフォーム]->[追加]
  3. なし->場所->追加->インストール
  4. 名前=MAT
  5. 場所=/path / to / MAT / installation / mat

プロジェクトの設定

  1. ファイル->新規->その他->プラグインプロジェクト

    名前:MAT拡張

    • アクティベーターを無効にする
    • UIへの投稿を無効にする
    • API分析を無効にする
    • テンプレートを無効にする
  2. 終了

コード生成

plugin.xmlを開きます

  1. 依存関係->追加
    • org.eclipse.mat.apiを選択します
  2. 拡張機能->追加
    • org.eclipse.mat.report.queryを選択します
  3. report.queryを右クリック->新規
    • 名前:MyQuery
    • 「impl」をクリックしてクラスを生成します

IQueryの実装

@CommandName("MyQuery") //for the command line interface
@Name("My Query") //display name for the GUI
@Category("Custom Queries") //list this Query will be put under in the GUI
@Help("This is my first query.") //help displayed
public class MyQuery implements IQuery
{
     public MyQuery{}

     @Argument //snapshot will be populated before the call to execute happens
     public ISnapshot snapshot;

     /*
      * execute : only method overridden from IQuery
      *           Prints out "My first query." to the output file.
     */
     @Override
     public IResult execute(IProgressListener arg0) throws Exception
     {
            CharArrayWriter outWriter = new CharArrayWriter(100);
            PrintWriter out = new PrintWriter(outWriter);
            SnapshotInfo snapshotInfo = snapshot.getSnapshotInfo();
            out.println("Used Heap Size: " + snapshotInfo.getUsedHeapSize());
            out.println("My first query.")
            return new TextResult(outWriter.toString(), false);
     }
}

ctrl + shift + oは、正しい「インポート」ステートメントを生成します。開いたhprofファイルの上部にあるツールバーの[クエリブラウザを開く]にアクセスすると、MATGUI内でカスタムクエリにアクセスできます。

ISnapshotインターフェース

ヒープダンプからデータを抽出するために使用できる最も重要なインターフェイスは、ISnapshotです。ISnapshotはヒープダンプを表し、そこからオブジェクトとクラスを読み取ったり、オブジェクトのサイズを取得したりするためのさまざまなメソッドを提供します…</ p>

ISnapshotのインスタンスを取得するには、SnapshotFactoryクラスの静的メソッドを使用できます。ただし、これは、APIを使用してMemoryAnalyzerから独立したツールを実装する場合にのみ必要です。MATに拡張機能を記述している場合、コーディングは、インジェクションまたはメソッドパラメーターとして、すでに開かれているヒープダンプに対応するインスタンスを取得します。

参照

組み込みのコマンドラインユーティリティ

プログラムに通常のレポートを生成させる場合は、 EclipseのMATツールをダウンロードするとParseHeapDumpというコマンドラインユーティリティを使用できます。MATが保存するすべての情報の有用なhtmlダンプを取得できるようになります。

> ParseHeapDump <heap dump> org.eclipse.mat.api:suspects org.eclipse.mat.api:top_components org.eclipse.mat.api:overview #will dump out all general reports available through MAT

うまくいけば、これはあなたが始めるのに十分な情報です。

于 2014-12-10T00:16:39.923 に答える
0

私はjhatに精通していませんが、EclipseのMATはオープンソースです。彼らのSVNリンクが利用可能であり、おそらくあなたは彼らのパーサーのためにそれを調べることができ、おそらくそれを使用することさえできます。

于 2012-06-20T20:32:40.197 に答える