首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java会抛出java.lang.OutOfMemoryError: metaspace,但是有很多免费的Metaspace呢?

为什么Java会抛出java.lang.OutOfMemoryError: metaspace,但是有很多免费的Metaspace呢?
EN

Stack Overflow用户
提问于 2016-12-07 07:58:18
回答 1查看 5K关注 0票数 0

在我的应用程序中,我在运行时创建了大量的java类,并使用javassist库。在某个时候,会抛出一个java.lang.OutOfMemoryError: Metaspace,但是java进程监视(基于java.lang.management.MemoryPoolMXBean)报告说有很多免费的元应用程序。为什么会这样呢?以及如何使用100%的元内存池?

我创建了一个最小的应用程序来复制问题oom

将其加载到项目dir,然后执行'ant‘。在这个应用程序中,我设置了-XX:MaxMetaspaceSize=100m,但是OOM会在23564 at的元应用程序中抛出。

错误的调用堆栈是:

代码语言:javascript
复制
javassist.CannotCompileException: by java.lang.OutOfMemoryError: Metaspace
    at javassist.ClassPool.toClass(ClassPool.java:1170)
    at javassist.CtClass.toClass(CtClass.java:1316)
    at com.tradingview.Main.generateRandomClass(Main.java:53)
    at com.tradingview.Main.main(Main.java:24)
Caused by: java.lang.OutOfMemoryError: Metaspace
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at javassist.ClassPool.toClass2(ClassPool.java:1183)
    at javassist.ClassPool.toClass(ClassPool.java:1164)
    ... 3 more
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-07 08:51:15

哇,我刚找到答案。问题是,在我的应用程序中,我为每个生成的类创建了一个单独的新ClassLoader。我在我的示例应用程序中做了一个修改,它将所有生成的类放到一个ClassLoader中,然后在空闲元空间几乎为零的时候抛出OOM。修复程序在这里,oom/commit/d6bcade51f79758e2413d1852c771f163392c294分支fix_of_the_problem

有人知道java进程中类加载器的限制吗?以及如何增加它们?

还发现了这个Why MetaSpace Size is twice as big as Used MetaSpace?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41012127

复制
相关文章

相似问题

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