JVM - 方法区(永久代)的垃圾回收

方法区在HotSpot中也被成为永久代,该部分垃圾收集的效率比较低。

永久代主要针对废弃常量和无用的类两部分内容进行回收。

废弃常量的回收:以常量池中字面量的回收为例,在当前系统中没有任何地方引用某个字面量时,那么如果此时发生垃圾回收,而且必要的话,该字面常量将会被回收掉。常量池中的其他类(接口),方法,字段的符号引用的回收与此类似。

无用的类:同时满足下面三个条件的类,才可以被回收,但是仅仅是可以,并非不使用了必然会回收,受虚拟机参数控制。

1. 该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。

2. 加载类的ClassLoader已经被回收。

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


在大量使用反射、动态代CGLib等ByteCode框架、动态生成JSP以及OSGI这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出。

猜你喜欢

转载自blog.csdn.net/qq_29676623/article/details/84176987