日期:2014-05-20  浏览次数:20601 次

【jvm深入了解的高手回答下啊】jvm Perm区gc回收问题
本帖最后由 fhqibjg 于 2013-02-17 18:15:45 编辑
我们知道jvm里堆空间划分为三个代:
年轻代(Young Generation)
年老代(Old Generation)
永久代(Permanent Generation)

年轻代和年老代是存储动态产生的对象。永久带主要是存储的是java的类信息,包括解析得到的方法、属性、字段等等。永久带基本不参与垃圾回收

现在问题出现了:

 [Full GC (System) 3601.118: [CMS: 187025K->113740K(5242880K), 0.8019600 secs] 1129480K->113740K(7340032K), [CMS Perm : 57763K->50540K(131072K)], 0.8024830 secs] [Times: user=0.80 sys=0.00, real=0.80 secs] 

1,当出现Fullgc后,明显看到perm己发生过回收,且系统中会出现反射调用失败的一些提示信息。

2,在配制cms回收时,看到Perm开启CMS回收Perm区选项:
+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled
 

也就是说perm区是可以回收的,那perm区可回收这与jdk版有关系(原老版本是不可以)?还有perm区回收是主要回收什么(全部都回收还是只收收部分)?

jvm jvm堆栈 fullGc perm静态区

------解决方案--------------------
引用:
还有就是想知道,回收后那些静态类或静态变量怎么办?如果再次调用到静态方法,是否重新classload到内存新开辟空间

如果是真的因为某些原因被回收了,要再用那估计就是要重新加载了(除非回收是基于保证不再使用,但不知道这能否实现),就像初始化时一样。
------解决方案--------------------
引用:
还有就是想知道,回收后那些静态类或静态变量怎么办?如果再次调用到静态方法,是否重新classload到内存新开辟空间


所以说类的回收条件是及其苛刻的:
只有无用的类才可以回收,类需要同时满足下面3个条件才能算是“无用的类”:

□该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
加载该类的ClassLoader已经被回收。
□该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。