Wczoraj wdrożyłem moją pierwszą aplikację Grails (2.3.6) na serwer dev i zacząłem ją monitorować. Właśnie dostałem automatyczny monitor stwierdzający, że procesor został przypięty do tego komputera, więc go włączyłem. Uruchomiłem top
i odkryłem, że to PID mojej aplikacji Java przypinał serwer. Zauważyłem też, że pamięć wynosi 40%. Po kilku sekundach procesor przestał przypinać, spadł do normalnego poziomu, a pamięć wróciła do zakresu ~ 20%. Klasyczny główny GC.Zrozumienie wycieku klasy Groovy/Grails
Podczas zbierania zrobiłem kupę sterty. Po GC otworzyłem zrzut w JVisualVM i zobaczyłem, że większość pamięci była przydzielana dla klasy org.codehaus.groovy.runtime.metaclass.MetaMethodIndex.Entry
. Łącznie było ich ponad 250 000, pobierając około 25 MB pamięci.
I googled tej klasy i spojrzał na to ultra helpful Javadocs. Wciąż nie mam pojęcia, co robi ta klasa.
Jednak w googlowaniu pojawiły się także około tuzin artykułów pokrewnych (niektóre z pytań SO) dotyczących tej klasy i przeciek PermGen/classloader z aplikacjami Grails/Groovy. I choć wygląda na to, że moja aplikacja rzeczywiście wyczyściła te 250K wystąpienia z GC, nadal niepokoi, że było tak wiele jego instancji, a GC przypięła procesor przez ponad 5 minut.
Moje pytania:
- Co to jest klasa i jaka jest Groovy robi z nim?
- Czy ktoś może mi wyjaśnić this answer? Dlaczego
-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
pomógłby rozwiązać ten konkretny problem? - Dlaczego ta klasa jest szczególnie kłopotliwa dla PermGen?