1、方法区
JVM中的方法区,按分代算法属于持久代,所以一般也被称为持久代。
2、回收对象
方法区主要保存类信息(构造器)、常量、静态变量等,可回收对象为:废弃常量,无用的类。
- 回收废弃常量与JAVA对象一致,无用即删;
以常量池中字面量的回收为例,
例如一个字符串“abc”已经进入常量池,但是无任何String对象引用常量池的此常量,也无其它引用此字面量,“abc”常量会被系统清理出常量池。
常量池中的其他类(接口)、方法、字段的符号引用也是如此。
- 无用的类回收有以下条件:
①JAVA实例已经全部被回收,在堆中没有该类的示例存在;
②该类的classLoader被回收;
③该类的java.long.class对象没有被引用,不会被其他方法通过反射访问该类的方法
与堆中的对象回收机制不同,不是不用即回收。HotSpot虚拟机提供了-Xnoclassgc参数进行控制是否回收。
3、应用场景
在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGi这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载功能,以保证方法区不会溢出。