在我的应用程序中,我在运行时创建了大量的java类,并使用javassist库。在某个时候,会抛出一个java.lang.OutOfMemoryError: Metaspace,但是java进程监视(基于java.lang.management.MemoryPoolMXBean)报告说有很多免费的元应用程序。为什么会这样呢?以及如何使用100%的元内存池?
我创建了一个最小的应用程序来复制问题oom
将其加载到项目dir,然后执行'ant‘。在这个应用程序中,我设置了-XX:MaxMetaspaceSize=100m,但是OOM会在23564 at的元应用程序中抛出。
错误的调用堆栈是:
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发布于 2016-12-07 08:51:15
哇,我刚找到答案。问题是,在我的应用程序中,我为每个生成的类创建了一个单独的新ClassLoader。我在我的示例应用程序中做了一个修改,它将所有生成的类放到一个ClassLoader中,然后在空闲元空间几乎为零的时候抛出OOM。修复程序在这里,oom/commit/d6bcade51f79758e2413d1852c771f163392c294分支fix_of_the_problem
有人知道java进程中类加载器的限制吗?以及如何增加它们?
https://stackoverflow.com/questions/41012127
复制相似问题