垃圾回收不会发生在永久代,如果永久代满了或者是超过了临界值,会触发完全垃圾回收(Full
GC)。如果你仔细查看垃圾收集器的输出信息,就会发现永久代也是被回收的。这就是为什么正确的永久代大小对避免Full
GC是非常重要的原因。请参考下Java8:从永久代到元数据区
(注:Java8中已经移除了永久代,新加了一个叫做元数据区的native内存区)
有人认为方法区不存在垃圾回收,其实在JVM规范中对方法区的约束也是非常宽松的,甚至提过可以不要求虚拟机在方法区实现垃圾回收。对于方法区的垃圾回收主要回收两部分:运行时常量池废弃的常量、不再使用的类型。
HotSpot虚拟机对常量池的回收策略是很明确的,只要常量池中的常量没有被任何地方引用,就可以被回收。
而判断一个类型是否该被回收的条件就比较苛刻了,包括如下:
①该类所有实例都已经被回收;
②加载该类的类加载器已经被回收;(这个条件除非是经过精心设计的可替换类加载器的场景,否则通常很难达成)
③该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。