[英]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空間被該類型的對象占用。
它是否正確? 謝謝!
從這篇博客文章 :
對於每個類裝入器對象,將打印以下詳細信息:
- (class_loader)類加載器對象的地址 - 在運行實用程序時的快照中。
- (classes)加載的類數(由此加載器使用方法(java.lang.ClassLoader.defineClass)定義)。
- (bytes)此類加載器加載的所有類的元數據消耗的近似字節數。
- (parent_loader)父類加載器的地址(如果有)。
- (活着?) “實時”或“死”指示 - 指示加載器對象將來是否將被垃圾收集。
- (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.