1

私の質問はこれとは異なります。アプリケーションのプロファイリングを行ったのですが、遅すぎます。
1 つのプロセスが完了した後、ヒープ ウォーカーにいくつかのライブ オブジェクトが表示されました。

データベースからいくつかのデータをキャッシュしていますが、ヒープウォーカーはそこにあるべきではないやHashMapのようないくつかのライブオブジェクトを表示します。Resultset.getStringStatement.getString

HashMap.put()上記の 2 つの方法よりもメモリ使用量が非常に少なくなります。

この分析は正しいですか? または、何か不足しており、メモリがHashMapそれ自体で占有されておりHeapWalker、JDBC のメソッド (getStringおよびexecuteQuery) を表示しているだけです。

4

2 に答える 2

2

メソッドについて話しているので、ヒープウォーカーの「割り当て」ビューを見ていると思います。このビューには、オブジェクトが参照されている場所ではなく、オブジェクトが作成された場所が表示されます。JProfiler での割り当ての記録を説明するスクリーン キャストがあります。

HashMap.putキーと値のペアを格納するために使用される小さな「エントリ」オブジェクトを作成するだけです。多くのメモリを消費するオブジェクトは、ハッシュ マップに配置する前に作成されます。

Resultset.getStringデータベースから読み取る String オブジェクトをStatement.getString作成します。そのため、これらのオブジェクトの一部は長寿命であると想定するのが妥当です。

オブジェクトがまだヒープ上にある理由を調べるには、参照ビューに移動し、着信参照を選択して「GC ルートへのパス」を検索する必要があります。「最大オブジェクト」ビューは、過度のメモリ使用量を追跡するのにも非常に役立ちます。

于 2012-02-23T13:21:13.490 に答える
1

表示されるのは、接続 (おそらくそのバッファー キャッシュ) またはステートメントまたは結果セットによって保持されるキャッシュ データです。

これは、接続、ステートメント、または結果セットを閉じていないか、接続プーリングが原因である可能性があります。メモリ プロファイルを見ると、"GC ルートへのパス" (オブジェクト ルートへのパス) を確認できる場合があり、これはResultSet文字列を保持しているものを示します。それがコード内にあるか、保持するものにキャッシュされているか、プールにあるかを確認する必要があります。

注:私は JProfiler を使用していませんが、これがYourKitで追跡する方法です。

于 2012-02-23T09:10:39.667 に答える