04–内存区域–方法区
1、结构图
2、方法区–特征
1、 全局共享;
2、 JVM不要求该区域实现自动内存管理,但是商用Java虚拟机都能够自动管理该区域的内存;
3、 它主要存储jvm加载类的类信息,静态变量,常量(这个在meta-area的常量区),和即时编译器编译后的代码等数据;
4、 可能出现OutOfMemoryError异常;
5、 有人称其为永久代,但本质不等价;
6、 垃圾收集;
1、 可选;
2、 垃圾收集行为出现频率低;
3、 回收目标主要针对常量池的回收和类型的卸载;
3、方法区–溢出案例
/**
* VM Args: -XX:PermSize=10M -XX:MaxPermSize=10M
*
*/
public class MethodAreaOOMTest {
static class OOMObject {}
//借助CGLib直接操作字节码运行时生成了大量的动态类。
public static void main(String[] args) {
while (true) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(OOMObject.class);
enhancer.setUseCache(false);
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
return proxy.invokeSuper(obj, args);
}
});
enhancer.create();
}
}
}
结果:
Caused by: java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
at java.lang.ClassLoader.defineClass(ClassLoader.java:616)