Mam aplikację WWW Java działającą na serwerze Tomcat 7, która wydaje się mieć wyciek pamięci. Średnie wykorzystanie pamięci aplikacji wzrasta liniowo w miarę upływu czasu (pod wpływem JConsole). Po zużyciu pamięci osiąga plateau, wydajność spada znacznie. Czas reakcji wynosi od ~ 100ms do [300ms, 2500ms], co w rzeczywistości powoduje prawdziwe problemy.Przeciek pamięci w aplikacji WWW Java
profil pamięć JConsole mojej aplikacji:
Korzystanie VisualVM, widzę, że co najmniej połowa pamięć jest używana przez tablic znakowych (tj char []), a większość (w przybliżeniu taka sama liczba każdego z 300 000 wystąpień) łańcuchów znaków są jednym z następujących: "Awaria alokacji", "Kopiuj", "koniec mniejszego GC", z których wszystkie wydają się być związane z powiadomieniem o usuwaniu śmieci. O ile mi wiadomo, aplikacja w ogóle nie monitoruje śmieciarek. VisualVM nie może znaleźć katalogu głównego GC dla żadnego z tych łańcuchów, więc trudno jest go śledzić.
Memory Analyzer zrzut stosu:
Nie potrafię wyjaśnić, dlaczego płaskowyże zużycie pamięci tak, ale mam teorię, dlaczego wydajność degraduje raz robi. Jeśli pamięć jest pofragmentowana, aplikacja może zająć dużo czasu, aby przydzielić ciągły blok pamięci do obsługi nowych żądań.
Porównując to do wbudowanej aplikacji statusu serwera Tomcat, pamięć zwiększa się i zmniejsza poziomy na, ale nie trafia w wysoki "poziom", jak moja aplikacja. Nie ma również dużej liczby nieosiągalnych znaków [].
profil pamięć JConsole Tomcat aplikacji statusu serwera:
Memory Analyzer zrzut stosu Tomcat status serwera applicationp:
Gdzie mógłby te łańcuchy zostały przyznane i dlatego nie są one Czy zebrano śmieci? Czy są ustawienia Tomcat lub Java, które mogą mieć na to wpływ? Czy istnieją konkretne pakiety, które mogą mieć na to wpływ?
W jaki sposób ustaliłeś, że te struny w szczególności nie są gc? – djechlin
Gdy moja aplikacja jest bezczynna, wymuszam odśmiecanie i wykonuję zrzut sterty za pomocą VisualVM. Liczba tych ciągów zawsze rośnie z czasem i zawsze stanowi co najmniej połowę zużytej pamięci. –
Analizator pamięci wskazuje, że nieosiągalne obiekty char [] i String odpowiadają za 176 MB sterty 210 MB. –