方法区回收条件苛刻,方法区的垃圾收集的性价比低:
在java堆中,尤其是在新生代中,一次垃圾收集通常可以回收70%~99%的内存空间。
方法区垃圾收集主要包括两个部分:
废弃的常量,不再使用的类型
【废弃的常量】
与回收堆对象类似。
例 :常量池字面量回收
如果虚拟机在其他地方没有引用这个常量量,如果发生垃圾回收,并且垃圾收集器判断确实有必要的话,这个常量就会被系统清理出常量池。
【不再使用的类型】
(1)该类的所有的实例都已经被回收
(2)加载该类的类加载器已经被回收
(3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类。
java虚拟机允许对满足上面三个条件的类回收,但是对于是否要对类型进行回收,Hotspot虚拟机提供了-Xnoclassgc参数进行控制。