私のアプリケーションでは、特定の入力用に約 10 GB の RAM が必要ですが、通常の入力の場合は約 1 GB で十分です。JProfiler を使用して詳細に分析すると、(GC の後) からの標準クラスによってかなりの量のメモリが使用されていることがわかりますjava.util.*
。
LinkedHashMap$Entry
、HashMap$Entry[]
、LinkedHashMap
、HashMap$KeySet
、HashMap$EntrySet
、LinkedHashSet
、TreeMap$Entry
およびTreeMap
(この順序で)、および関連するクラス。次のエントリは、私自身のコードのクラスのもので、インスタンスの数と使用されるメモリの量が非常に妥当なようです。
ヒープの合計使用量が約 900 MB である詳細については、ビューに次のSize
エントリが表示されます。All Objects
LinkedHashMap$Entry
:418MBHashMap$Entry[]
:178MBLinkedHashMap
:124MBHashMap$KeySet
:15MByte
everyが. LinkedHashMap
_LinkedHashSet
LinkedHashMap
オブジェクトの割り当てを JProfiler に記録し、Allocation Hot Spots
forを観察しました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)、ライセンス済み