Blog gönderisine göre Java JVM için -XX seçeneklerinin en eksiksiz listesi , CMS çöp toplayıcısı altında sınıf boşaltma özelliğinin etkin olup olmadığını belirler. Varsayılan değer false
. Adlı başka bir seçenek var ClassUnloading
olduğu true
(muhtemelen) başka çöp toplayıcıları etkileyen varsayılan olarak.
Fikir şu ki, GC daha önce yüklenmiş bir sınıfın JVM'de artık kullanılmadığını tespit ederse, sınıfların bayt kodunu ve / veya yerel kodu tutmak için kullanılan belleği geri kazanabilir.
CMSClassUnloadingEnabled öğesini ayarlamak , şu anda CMS toplayıcısını kullanıyorsanız permgen sorununuza yardımcı olabilir . Ancak, CMS kullanmamanız ya da sınıf yükleyiciyle ilgili gerçek bir bellek sızıntısı olma ihtimaliniz vardır. İkinci durumda, sınıfınız asla GC'ye kullanılmamış gibi görünmeyecektir ... ve bu nedenle asla boşaltılmayacaktır.
Aaron Digulla "sınıflar sonsuza dek" diyor. Bu tamamen Java dünyasında bile kesinlikle doğru değildir. Aslında, bir sınıfın ömrü sınıf yükleyicisine bağlıdır. Dolayısıyla, bir sınıf yükleyicinin çöp toplandığını (ve bu her zaman kolay bir şey değildir) ayarlayabilirseniz, yüklediği sınıflar da çöp toplanır.
Aslında, bir web uygulamasının sıcak yeniden dağıtımını yaptığınızda olan şey budur. (Ya da en azından, kalıcı bir depolama sızıntısına yol açan sorunları önleyebiliyorsanız, olması gereken budur.)
CMSClassUnloadingEnabled
herhangi bir etki yaratmasını,UseConcMarkSweepGC
ayrıca ayarlanması gerekir