JVM-06方法区

62 阅读1分钟

方法区

image.png

组成

image.png

方法区内存溢出

/**
  * 演示元空间内存溢出
  * -XX:MaXMetaspaceSize=8m
**/
public class Demo1_8 extends ClassLoader{ //可以用来加载类的二进制字节码
    public static void main(String[] args){
        int j = 0;
        try{
            Demo1_8 test = new Demo1_8();
            for(int i = 0; ii < 10000; i++){
                //ClassWriter作用是生成类的二进制字节码
                ClassWriter cw = new ClassWriter(0);
                //版本号,public,类名,包名,父类,接口
                cw.visit(Opcodes.V1_8,Opcodes.ACC_PUBLIC,"Class" + i,null,"java/lang/object",null);
                //返回byte[]
                byte[] code = cw.toByteArray();
                //执行了类的加载
                test.defineClass("Class"+i,code,0,code.length);
            }
        }finally{
            System.out.println(j);
        }
    }


}
  • 1.8以前会导致永久代内存溢出

演示永久代内存溢出:java.lang.OutOfMemoryError: PermGen space

-XX:MaXPermSize=8m

  • 1.8之后会导致永久代内存溢出

演示永久代内存溢出:java.lang.OutOfMemoryError: Metaspace

-XX:MaXMetaspaceSize=8m

场景

  • spring
  • mybatis