簡體   English   中英

如何解釋“jmap -permstat”的輸出?

[英]How to interpret the output from “jmap -permstat”?

我正在嘗試解決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

以下是我將如何解釋上述輸出 - 請更正我在此過程中所犯的任何錯誤。

“類型”列中的值不是唯一的。 我們看到一些出現三次的物體。 但是,class_loader值在所有三個中都是唯一的; 因此,它們中的每一個都是一個獨特的對象,占據了permgen空間。 在這個例子中,每個占用100個字節; 因此,SomeClassLoader類型的對象占用了300字節的permgen空間。

如果classes值為非零,則此對象必須是某種類加載器,並且這指的是它引用的類的數量。 (注意:在實際文件中,這三個對象在bytes列中都有零;我為這個例子添加了值。在實際操作中,我猜測如果classes列中有0,那就沒辦法了bytes值可以是零。)

如果alive值為“dead”,則表示該對象已准備好進行垃圾回收,但JVM沒有這樣做。 關於可能出現這種情況的原因,需要單獨討論。

如果parent_loader列中有一個值,那么這是一個由另一個類加載器引用的對象,並且在該對象被垃圾回收之前不能進行垃圾回收。

最后:1)如果我在報告中看到所有列出相同類型的500行,2)但是它們列出了不同的class_loader值,3)然后我可以在字節列4)中添加值,這將准確地表示多少permgen空間被該類型的對象占用。

它是否正確? 謝謝!

從這篇博客文章

對於每個類裝入器對象,將打印以下詳細信息:

  1. (class_loader)類加載器對象的地址 - 在運行實用程序時的快照中。
  2. (classes)加載的類數(由此加載器使用方法(java.lang.ClassLoader.defineClass)定義)。
  3. (bytes)此類加載器加載的所有類的元數據消耗的近似字節數。
  4. (parent_loader)父類加載器的地址(如果有)。
  5. (活着?) “實時”或“死”指示 - 指示加載器對象將來是否將被垃圾收集。
  6. (type)此類加載器的類名。

永久生成不包含普通對象,而是包含類元數據(請參閱PermGen實際上代表什么? )。 所以,重寫你的陳述:

最后:1)如果我在報告中看到所有列出相同類型的500行,2)但是它們列出了不同的class_loader值,3)然后我可以在字節列4)中添加值,這將准確地表示多少permgen空間被同一(SomeClassLoader)類的類加載器對象加載的所有類元數據占用。

Eclipse Memory Analyzer工具顯示的“保留堆”是指對象消耗的堆內存(年輕+舊)。

永久生成在堆之外(參見https://stackoverflow.com/a/12058171/33622 )並處理類元數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM