я вижу следующее из «jmap -permstat»:мертвых загрузчиков классов не мусор, собранные из PermGen
0x000000077736cce0 12 173472 0x00000007723425d0 dead com/sun/org/apache/xalan/internal/xsltc/trax/[email protected]
0x0000000777168a20 12 172264 0x00000007723425d0 dead com/sun/org/apache/xalan/internal/xsltc/trax/[email protected]
0x0000000780b3c810 12 172264 0x00000007723425d0 dead com/sun/org/apache/xalan/internal/xsltc/trax/[email protected]
0x0000000776ca6170 12 172264 0x00000007723425d0 dead com/sun/org/apache/xalan/internal/xsltc/trax/[email protected]
0x00000007772b28a8 12 172264 0x00000007723425d0 dead com/sun/org/apache/xalan/internal/xsltc/trax/[email protected]
....
Есть более 6000 в PermGen этих мертвых класса TransletClassLoader погрузчиков теперь, и число продолжает расти, пока я не получаю эта ошибка:
java.lang.OutOfMemoryError: PermGen space
у меня есть следующий набор флагов JVM:
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled
java version "1.6.0_33"
Java(TM) SE Runtime Environment (build 1.6.0_33-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.8-b03, mixed mode)
Почему эти погрузчики мертвого класса не очищаются с помощью флага CMSClassUnloadingEnabled? Как исправить эту проблему?
Обратите внимание, что «ссылка» на ClassB может просто состоять в том, что ClassA имеет нулевую ссылочную переменную типа ClassB или содержит вызов метода, который имеет параметр ClassB. И даже не обязательно быть экземпляром ClassA.Это означает, что вы * всегда * должны использовать схему поиска по имени для ссылки на ClassB на что-то вне своего загрузчика классов и всегда должны использовать интерфейсы или суперклассы для ссылки на свои экземпляры. –
Что может привести к отказу Classloader? –
ClassLoader может собирать только мусор, когда он становится недоступным. –