Mic*_*ael 15 java permgen jmap
我正在尝试解决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
Run Code Online (Sandbox Code Playgroud)
以下是我将如何解释上述输出 - 请更正我在此过程中所犯的任何错误.
"类型"列中的值不是唯一的.我们看到一些出现三次的物体.但是,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工具显示的"保留堆"是指对象消耗的堆内存(年轻+旧).
永久生成在堆之外(参见/sf/answers/844072001/)并处理类元数据.