Ieri ho distribuito la mia prima app Grails (2.3.6) su un server di sviluppo e ho iniziato a monitorarlo. Ho appena ricevuto un monitor automatico che indica che la CPU è stata bloccata su questa macchina, quindi ho inserito SSHed. Ho eseguito top
e ho scoperto che era il PID della mia app Java a bloccare il server. Ho anche notato che la memoria era al 40%. Dopo alcuni secondi, la CPU ha smesso di bloccare, è scesa a un livello normale e la memoria è tornata giù nell'intervallo ~ 20%. GC principale classico.Comprensione perdita del classloader Groovy/Grails
Mentre stava raccogliendo, ho fatto una discarica di heap. Dopo il GC, ho quindi aperto il dump in JVisualVM e ho visto che la maggior parte della memoria era allocata per una classe org.codehaus.groovy.runtime.metaclass.MetaMethodIndex.Entry
. Ci sono stati quasi 250.000 esempi di questi in totale, consumando circa 25 MB di memoria.
Ho cercato su Google questa classe e ho dato un'occhiata al numero ultra helpful Javadocs. Quindi non ho ancora idea di cosa faccia questa classe.
Ma google ha anche pubblicato circa una dozzina di articoli correlati (alcuni dei quali domande) che coinvolgono questa classe e una fuga PermGen/classloader con le applicazioni Grails/Groovy. E anche se sembra che la mia app abbia effettivamente ripulito questa istanza di 250K con un GC, è comunque preoccupante che ci siano state così tante istanze e che il GC abbia bloccato la CPU per oltre 5 minuti.
Le mie domande:
- Che cosa è questa classe e ciò che è Groovy facendo con esso?
- Qualcuno può spiegare this answer a me? Perché
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
può aiutare questo particolare problema? - Perché questa classe è particolarmente problematica per il PermGen?