В моем приложении я создаю много классов java во время выполнения с библиотекой javassist. В какой-то момент забрасывается, но мониторинг процесса Java (на основе java.lang.management.MemoryPoolMXBean) сообщает, что существует множество бесплатных метапроцессов. Почему это? И как использовать 100% пула памяти в метапассе?Почему Java бросает java.lang.OutOfMemoryError: Metaspace, но есть много свободного метапроцесса?
Я создал минимальное приложение, которое воспроизводит проблему https://github.com/vlkv/java_metaspace_oom
DONWLOAD его, перейди директорию проекта, а затем выполнить «муравей бежать». В этом приложении я установил -XX: MaxMetaspaceSize = 100 м, но OOM выбрасывается в некоторый момент около 23564 Кб используемой метапрограммы.
стек вызовов ошибки:
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