04、JVM实战:内存区域:方法区

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)