在我的應用程序中,我使用javassist庫在運行時創建了大量的java類。在某個時候拋出了一個java.lang.OutOfMemoryError: Metaspace
,但java進程監視(基於java.lang.management.MemoryPoolMXBean)報告有很多免費的metaspace。這是爲什麼?以及如何使用100%的metaspace內存池?爲什麼Java會拋出java.lang.OutOfMemoryError:Metaspace,但有很多免費的元組空間?
我創建了一個最小的應用程序能重現問題https://github.com/vlkv/java_metaspace_oom
Donwload它,cd到項目目錄,然後執行「螞蟻跑」。在這個應用程序中,我已經設置了-XX:MaxMetaspaceSize = 100m,但是在使用元代空間23564Kb的某個點引發了OOM。錯誤的
調用堆棧是:
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
時的內存要求*量超過*的可用空間,則拋出該異常。不是當空閒空間爲零時。 – EJP
@EJP根據OP,在拋出異常時仍然有一些可用空間可用 – qxz
@vitvlkv您是否調試過它以查看程序中異常來自哪裏?小心提供[最小,完整,可驗證示例](http://stackoverflow.com/help/mcve)? – qxz