在我的应用程序中,我使用javassist库在运行时创建了许多java类。在某些时候抛出java.lang.OutOfMemoryError: Metaspace
但是java进程监视(基于java.lang.management.MemoryPoolMXBean)报告有足够的空闲元空间。这是为什么?以及如何使用100%的元空间内存池?
我创建了一个可以重现问题的最小应用程序https://github.com/vlkv/java_metaspace_oom
下载它,cd到项目目录然后执行' ant run'。在这个应用程序中,我设置了-XX:MaxMetaspaceSize = 100m,但在某个点上抛出了OOM,大约使用了23564Kb的元空间。
错误的调用堆栈是:
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
答案 0 :(得分:-1)
有人知道java进程中类加载器的限制是什么?以及如何增加它们?