私は permgen リークのトラブルシューティングを試みており、jmap -permstat からの出力を解釈する方法について意見を求めたいと思っています。
次のような jmap -permstat レポートがあるとします。
class_loader classes bytes parent_loader alive? type
<bootstrap> 4791 25941568 null live <internal>
0x00000007203ed508 0 0 0x00000007203ed228 dead com/example/object/SomeObjectType$FirstClassLoader@0x0000000something1
0x000000071dc17620 1 3056 0x0000000705e692a8 dead sun/reflect/DelegatingClassLoader@0x0000000something4
0x000000071f26a898 0 100 null dead com/example/object/SomeClassLoader@0x0000000something3
0x0000000721c6dba0 0 100 null dead com/example/object/SomeClassLoader@0x0000000something3
0x000000071e36df20 0 100 null dead com/example/object/SomeClassLoader@0x0000000something3
0x000000072157c1b8 339 2069112 0x000000072157b8d8 dead com/example/object/SomeObjectType$SecondClassLoader@0x0000000something2
0x00000007128b7830 1 1912 0x0000000700056db8 dead sun/reflect/DelegatingClassLoader@0x0000000something4
0x0000000707634360 1 3088 0x0000000700056db8 dead sun/reflect/DelegatingClassLoader@0x0000000something4
上記の出力をどのように解釈するかを次に示します。その際に犯した間違いを修正してください。
「タイプ」列の値は一意ではありません。3 回出現するオブジェクトがいくつかあります。ただし、class_loader の値は 3 つすべてで一意です。したがって、それらのそれぞれは個別のオブジェクトであり、permgen スペースを占有します。この例では、それぞれが 100 バイトを占めています。したがって、300 バイトの permgen スペースが、タイプ SomeClassLoader のオブジェクトによって占有されています。
クラスの値がゼロ以外の場合、このオブジェクトは何らかのクラス ローダーである必要があり、これは参照するクラスの数を示します。(注: 実際のファイルでは、これら 3 つのオブジェクトのバイト列にゼロが含まれています。この例では値を追加しました。実際には、クラス列に 0 がある場合、バイト値はゼロ以外の値にすることができます。)
alive 値が「dead」の場合、オブジェクトはガベージ コレクションの準備ができているが、JVM はそうしていないことを意味します。これが当てはまる理由については、別の議論が必要です。
parent_loader 列に値がある場合、これは別のクラス・ローダーによって参照されているオブジェクトであり、そのオブジェクトがガベージ・コレクションされるまでガベージ・コレクションできません。
最後に: 1) レポートに 500 行が表示され、すべて同じタイプがリストされている場合、2) それらに異なる class_loader 値がリストされている場合、3) バイト列の値を合計することができます。 permgen スペースは、そのタイプのオブジェクトによって占有されています。
これは正しいです?ありがとう!