3

私のアプリケーションでは、特定の入力用に約 10 GB の RAM が必要ですが、通常の入力の場合は約 1 GB で十分です。JProfiler を使用して詳細に分析すると、(GC の後) からの標準クラスによってかなりの量のメモリが使用されていることがわかりますjava.util.*

LinkedHashMap$EntryHashMap$Entry[]LinkedHashMapHashMap$KeySetHashMap$EntrySetLinkedHashSetTreeMap$EntryおよびTreeMap(この順序で)、および関連するクラス。次のエントリは、私自身のコードのクラスのもので、インスタンスの数と使用されるメモリの量が非常に妥当なようです。

ヒープの合計使用量が約 900 MB である詳細については、ビューに次のSizeエントリが表示されます。All Objects

  • LinkedHashMap$Entry:418MB
  • HashMap$Entry[]:178MB
  • LinkedHashMap:124MB
  • HashMap$KeySet:15MByte

everyが. LinkedHashMap_LinkedHashSetLinkedHashMap

オブジェクトの割り当てを JProfiler に記録し、Allocation Hot Spotsforを観察しましたLinkedHashMap。そこに、理解できないエントリが表示されます。

  • 3 番目のエントリは、(割り当てられたメモリの 6.5% で) という名前のホット スポットを示しており、自分のコードではクラスですX.<init>Xこのメソッドのコンストラクターは、 とは何の関係もありませんLinkedHashMap。このエントリに続いThread.runて最後に、Thread.run. の私のコードの問題は何Xですか? なぜここに表示されるのですか?
  • という名前のホット スポットに、割り当てられたメモリの約 8% が​​表示されjava.util.HashSet.iteratorます。パーセンテージが最も高い (最初のエントリ: 2.8%) パスに沿ってこのエントリをたどると、最終的にjava.lang.Thread.run(2.8%) が表示されるまで、コード内にいくつかのメソッドが表示されます。これは何を意味するのでしょうか?私の知る限り、このThread.runメソッドは のインスタンスを作成しませんLinkedHashMap。メソッドとの関係はiterator

LinkedHashMap一般に、(多くの)オブジェクトへの参照を保持するコードを見つけるにはどうすればよいでしょうか? Heap Walker を使用すると、これらのインスタンスの多くしか確認できませんが、パターンは見られません (GC ルートへのパスを観察しても)。私の実験では、すべてのインスタンスが正常に機能しているように見えます。

おそらく重要なこと:

  • 私のアプリケーションは (さらなる処理のために) 結果を構築します。この構築では、高いメモリ使用量が観察されます。構築は継続的にオブジェクトを作成するため、安定点を待ってから、作成されたすべてのLinkedHashMapオブジェクトを観察することはできません。
  • デバッグに使用できる優れたコンピューターがあります (最大 48 コアと 192 GB の RAM、場合によってはそれ以上)。
  • Java バージョン "1.7.0_13" (Java(TM) SE ランタイム環境 (ビルド 1.7.0_13-b20)、Java HotSpot(TM) 64 ビット サーバー VM (ビルド 23.7-b01、混合モード))
  • JProfiler 7.2.2 (ビルド 7157)、ライセンス済み
4

1 に答える 1

5

一般に、(多くの)LinkedHashMapオブジェクトへの参照を保持するコードを見つけるにはどうすればよいですか?

ヒープウォーカーで、「LinkedHashMap」を選択し、新しいオブジェクトセットを作成します。次に、[参照]ビューに切り替えて、[累積された受信参照]を表示します。そこで、オブジェクトセット全体の参照を分析できます。

ここに画像の説明を入力してください

割り当てのホットスポットと、Thread.runメソッドが表示される理由についての質問:これらはバックトレースであり、ホットスポットがどのように呼び出されたかを示し、ノード上のすべての数値が上部のホットスポットへの寄与です。最も深いノードは、すでに常にエントリポイントであり、通常はThread.runメソッドまたはmainメソッドです。

于 2013-02-19T09:59:14.760 に答える