如何创建java.lang.OutOfMemoryError:Metaspace?

如何创建java.lang.OutOfMemoryError:Metaspace?,java,Java,我的目标是模拟一种情况,在这种情况下我可以收到这个错误。 我试过了 但这没用 我在配置中设置: -XX:MaxMetaspaceSize=50m 我试过了: public class Main { public static void main(String[] args) { for (int i = 0; ; i++) { Thread thread = new Thread(new A()); thread.start

我的目标是模拟一种情况,在这种情况下我可以收到这个错误。 我试过了 但这没用

我在配置中设置: -XX:MaxMetaspaceSize=50m

我试过了:

public class Main {
    public static void main(String[] args) {
        for (int i = 0; ; i++) {
            Thread thread = new Thread(new A());
            thread.start();
        }
    }
}
它: A和B POJO类

public class Main {
    static Map<A,B> map = new LinkedHashMap<>();
    public static void main(String[] args) {
        while (true){
            A a = new A();
            B b = new B();
           map.put(a,b);
        }
    }
}
公共类主{
静态映射映射=新建LinkedHashMap();
公共静态void main(字符串[]args){
while(true){
A=新的A();
B=新的B();
地图放置(a,b);
}
}
}

正如您提到的,您希望抛出
java.lang.OutOfMemoryError:Metaspace
。 为了实现这一点,您必须加载许多不同的类。这可以通过利用
javaassist
实现:

   static javassist.ClassPool cp = javassist.ClassPool.getDefault();

    public static void main(String[] args) throws Exception{
        for (int i = 0; ; i++) {
            Class c = cp.makeClass("mypackage.Myclass" + i).toClass();
        }
    }
使用以下元空间设置:

-XX:MaxMetaspaceSize=10m
-XX:MetaspaceSize=2M
-XX:MaxMetaspaceFreeRatio=1
-XX:MaxMetaspaceExpansion=1K
-XX:MinMetaspaceFreeRatio=1
-XX:InitialBootClassLoaderMetaspaceSize=2M
如果没有
javaassist
,则可以生成
java.lang.OutOfMemoryRor:Metaspace
,保持相同的Metaspace选项,如下所示:

            String clazzBase64 = "yv66vgAAADcADAEAEm15cGFja2FnZS9NeWNsYXNzMAcAAQEAEGphdmEvbGFuZy9PYmplY3QHAAMBAApTb3VyY2VGaWxlAQANTXljbGFzczAuamF2YQEABjxpbml0PgEAAygpVgwABwAICgAEAAkBAARDb2RlACEAAgAEAAAAAAABAAEABwAIAAEACwAAABEAAQABAAAABSq3AAqxAAAAAAABAAUAAAACAAY=";
            byte[] compiledClazz = Base64.getDecoder().decode(clazzBase64);
            int len = Integer.valueOf(compiledClazz[12]);

            MyClassLoader myClassLoader = new MyClassLoader(Thread.currentThread().getContextClassLoader());

            for (int i = 0; ; i++) {
                byte[] bytes = String.valueOf(i).getBytes();
                byte[] bytecode = new byte[compiledClazz.length + bytes.length - 1];
                System.arraycopy(compiledClazz, 0, bytecode, 0, 30);
                bytecode[12] = (byte)( len + bytes.length - 1 & 0xFF);

                System.arraycopy(bytes, 0, bytecode, 30, bytes.length);
                System.arraycopy(compiledClazz, 31, bytecode, 30 + bytes.length, compiledClazz.length - 31);

                String classname ="mypackage.Myclass" + i;
                Class c = myClassLoader.getClass(classname, bytecode);
            }

            public static class MyClassLoader extends ClassLoader {
               public MyClassLoader(ClassLoader parent) {
                  super(parent);
               }

               public Class<?> getClass(String name, byte[] code) {
                  return defineClass(name, code, 0, code.length);
               }
            }
String clazzBase64=“YV66VGAAADCADAEAEM15CGFJA2FNZS9NewnsyxNzMACAAQEAEGPHDMEVBGFUZY9PYMPLY3QHAAMBAAPTB3VYY2VGAWXLAQANTXLJBGFZCZZAUAMF2YQEABJXPBML0PGEAYGPVGWACGAAKBAARDB2替代AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
字节[]compiledClazz=Base64.getDecoder().decode(clazzBase64);
int len=Integer.valueOf(compiledClazz[12]);
MyClassLoader MyClassLoader=新的MyClassLoader(Thread.currentThread().getContextClassLoader());
对于(int i=0;i++){
byte[]bytes=String.valueOf(i).getBytes();
字节[]字节码=新字节[compiledClazz.length+bytes.length-1];
数组复制(compiledClazz,0,字节码,0,30);
字节码[12]=(字节)(len+bytes.length-1&0xFF);
System.arraycopy(字节,0,字节码,30,字节.长度);
数组复制(compiledClazz,31,字节码,30+字节.length,compiledClazz.length-31);
String classname=“mypackage.Myclass”+i;
c类=myClassLoader.getClass(类名,字节码);
}
公共静态类MyClassLoader扩展了ClassLoader{
公共MyClassLoader(ClassLoader父级){
超级(家长);
}
公共类getClass(字符串名称,字节[]代码){
返回defineClass(名称、代码、0、代码、长度);
}
}

谢谢!我已经尝试了你的解决方案,但是我收到了:线程“thread-0”java.lang.OutOfMemoryError中的异常:java堆空间,但是,我需要:java.lang.OutOfMemoryError:Metaspace我现在得到了,我的坏消息。我可以用javaassist模拟
java.lang.OutOfMemoryError:Metaspace