Согласно сообщению в блоге Наиболее полный список параметров -XX для Java JVM определяет, включена ли разгрузка классов в сборщике мусора CMS. По умолчанию это false
. По умолчанию существует еще одна опция ClassUnloading
, true
которая (предположительно) влияет на другие сборщики мусора.
Идея состоит в том, что если GC обнаруживает, что ранее загруженный класс больше не используется где-либо в JVM, он может освободить память, используемую для хранения байт-кода классов и / или собственного кода.
Установка CMSClassUnloadingEnabled может помочь с вашей проблемой permgen, если вы в настоящее время используете сборщик CMS . Но есть вероятность, что вы не используете CMS или у вас есть настоящая утечка памяти, связанная с загрузчиком классов. В последнем случае ваш класс никогда не появится в GC неиспользованным ... и поэтому никогда не будет выгружен.
Аарон Дигулла говорит, что «уроки навсегда». Это не совсем верно, даже в мире Java. Фактически, время жизни класса связано с его загрузчиком классов. Так что, если вы можете организовать загрузку классов (сборщик мусора) (а это не всегда легко сделать), то загруженные им классы также будут сборщиком мусора.
Фактически, это то, что происходит, когда вы делаете горячее повторное развертывание веб-приложения. (Или, по крайней мере, это то, что должно произойти, если вы можете избежать проблем, которые приводят к утечке в хранилище permgen.)
CMSClassUnloadingEnabled
чтобы иметь какое-либо влияние,UseConcMarkSweepGC
также должен быть установлен