Відповідно до публікації в блозі Найповніший список опцій -XX для Java JVM , він визначає, чи включено розвантаження класів під колектором сміття CMS. Типовим є false
. Існує ще один варіант називається ClassUnloading
це true
за замовчуванням , які (ймовірно) впливають на інші збирач сміття.
Ідея полягає в тому, що якщо GC виявить, що завантажений раніше клас більше не використовується ніде в JVM, він може відновити пам'ять, що використовується для утримання байт-коду та / або нативного коду класів.
Налаштування CMSClassUnloadingEnabled може допомогти з вашою проблемою permgen, якщо ви зараз використовуєте колектор CMS . Але ймовірність полягає в тому, що ви не використовуєте CMS або у вас є витоку пам'яті, пов’язаної з справжнім завантажувачем. В останньому випадку ваш клас ніколи не виявиться в GC невикористаним ... і тому ніколи не буде завантажений.
Аарон Дігулла каже, що "заняття навіки". Це не зовсім вірно, навіть у суто явському світі. Насправді, термін експлуатації класу пов'язаний з його завантажувачем. Тож якщо ви можете домовитись, що завантажувач класів збирає сміття (а це не завжди легко зробити), класи, які він завантажував, також будуть збирати сміття.
Насправді, це те, що відбувається, коли ви робите гарячу передислокацію веб-сторінки. (Або, принаймні, саме це має статися, якщо ви зможете уникнути проблем, які призводять до витоку накопичувача пермгену.)
CMSClassUnloadingEnabled
якого - небудь впливу,UseConcMarkSweepGC
також повинен бути встановлений