[讨论] 求问permGen中对GeneratedSerializationConstructorAccessor 的回收

wwwcomy 2014-09-28
环境:
win7(64位)+JDK1.6 u45(32位)+JBoss5.10GA

缘由:
公司最近在做压力测试,发现permgen不停的涨,并且Full GC后类没有被卸载掉,换了个JBoss5.10GA,使用同样的启动参数,发现类就可以卸载了。

原因:
发现我们使用的Drools这个第三方的包会不断地创建GeneratedSerializationConstructorAccessor + N这种类,看了下R大的帖子http://rednaxelafx.iteye.com/blog/548536 大概知道了一些原理。

问题:
Drools生成类的问题这个我会去慢慢排查,看看是不是API调用的问题。我主要还是想问一下PermGen在GC时候竟然不能回收类的问题。而且这种现象在换了JDK之后也会出现。


我试了下单独跑一个permgen OOM的测试用例,发现类是可以被卸载掉的,但是对上面有一个JBoss不能回收的问题实在是不解,我找了一下生成GeneratedSerializationConstructorAccessor 类的引用,发现只有 DelegatingClassLoader;并且我也跑过了jmap -permstat,发现这些都是dead的。 不回收情况的JvisualVM截图和家中不同的地方体现在(现在在家没有公司环境=。=), $classLoader$的后面有<jni global>的标记(见附件),不知道这个和能不能回收有关系,因为我对JNI不是很了解,所以希望大家给点建议:

1.JDK6如果不添加任何参数(如-XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled),默认FullGC应该是会卸载类吧?除了这个参数,有没有其他的参数会影响类的卸载?
2.如果遇到,不管加或者不加参数,都没有主动卸载类的话,一般是什么原因?
3.jni global标记的类是不是不会被GC?
4.为什么这些类有JNI Global标记,我该从哪里入手(看前面的环境应该只有JBoss是不同的,但是JBoss的启动参数从JVisualVM里看又是完全一样的,难道可以设置隐藏参数)?
5.http://hllvm.group.iteye.com/group/topic/37664 这个帖子的楼主最后说是YoungGC影响FullGC的触发,这个靠谱么?



希望各位大神指教~感谢!
wwwcomy 2014-09-28
额。。找到原因了。。

看错了,两个JBoss的参数不一样

不能回收的Jboss多了这个参数:

-agentlib:hprof=cpu=samples

看到这个是不能回收的原因。

具体这个参数干吗用的我还要再查一下。
Global site tag (gtag.js) - Google Analytics