方法区回收条件苛刻,方法区的垃圾收集的性价比低:

在java堆中,尤其是在新生代中,一次垃圾收集通常可以回收70%~99%的内存空间。

方法区垃圾收集主要包括两个部分:

废弃的常量,不再使用的类型

【废弃的常量】

与回收堆对象类似。

例 :常量池字面量回收

如果虚拟机在其他地方没有引用这个常量量,如果发生垃圾回收,并且垃圾收集器判断确实有必要的话,这个常量就会被系统清理出常量池。

【不再使用的类型】

(1)该类的所有的实例都已经被回收

(2)加载该类的类加载器已经被回收

(3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类。

java虚拟机允许对满足上面三个条件的类回收,但是对于是否要对类型进行回收,Hotspot虚拟机提供了-Xnoclassgc参数进行控制。