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