【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静态区
------解决方案--------------------
如果是真的因为某些原因被回收了,要再用那估计就是要重新加载了(除非回收是基于保证不再使用,但不知道这能否实现),就像初始化时一样。
------解决方案--------------------
所以说类的回收条件是及其苛刻的:
只有无用的类才可以回收,类需要同时满足下面3个条件才能算是“无用的类”:
□该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
□
加载该类的ClassLoader已经被回收。
□该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。