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