2016-12-07 4 views
0

В моем приложении я создаю много классов 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 
+1

Он бросает это исключение, когда объем памяти запрошенный * * превышает свободное пространство, доступное. Не тогда, когда свободное пространство равно нулю. – EJP

+0

@EJP Согласно OP, все еще есть свободное пространство, доступное при исключении исключения – qxz

+0

@vitvlkv Вы отлаживали его, чтобы увидеть, где в программе исходит исключение? Учтите, чтобы предоставить [Минимальный, полный, проверяемый пример] (http://stackoverflow.com/help/mcve)? – qxz

ответ

-1

Ничего себе, я только что нашел ответ. Проблема в том, что в моем приложении я создаю отдельный новый ClassLoader для каждого сгенерированного класса. Я сделал модификацию в своем примере приложения, которое помещает все сгенерированные классы в один ClassLoader, и после этого OOM бросается в точку, когда свободный metaspace почти равен нулю. Исправление находится здесь https://github.com/vlkv/java_metaspace_oom/commit/d6bcade51f79758e2413d1852c771f163392c294 branch fix_of_the_problem

Знает ли кто-нибудь о том, какие ограничения для загрузчиков классов в java-процессе? И как их увеличить?

Также нашел Why MetaSpace Size is twice as big as Used MetaSpace?

+0

Просьба пояснить, что противоречие между «множеством свободных метастазов» и «бесплатной метапасностью почти равно нулю». – EJP

+0

@EJP http://www.dictionary.com/browse/plenty – vitvlkv

 Смежные вопросы

  • Нет связанных вопросов^_^