首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建java.lang.OutOfMemoryError:元空间?

如何创建java.lang.OutOfMemoryError:元空间?
EN

Stack Overflow用户
提问于 2020-04-04 01:47:21
回答 1查看 280关注 0票数 3

我的目标是模拟一种我可以接收到这个错误的情况。我试过了How to simulate OutOfMemoryError: Metaspace,但是没有用。

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

已经尝试过了:

代码语言:javascript
复制
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类

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-04 02:45:13

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

代码语言:javascript
复制
   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();
        }
    }

具有以下元空间设置:

代码语言:javascript
复制
-XX:MaxMetaspaceSize=10m
-XX:MetaspaceSize=2M
-XX:MaxMetaspaceFreeRatio=1
-XX:MaxMetaspaceExpansion=1K
-XX:MinMetaspaceFreeRatio=1
-XX:InitialBootClassLoaderMetaspaceSize=2M

在没有javaassist的情况下,可以生成保持相同元空间选项的java.lang.OutOfMemoryEror: Metaspace,如下所示:

代码语言:javascript
复制
            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);
               }
            }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61017610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档