Mamy aplikację internetową działającą w Javie 6, Tomcat 6, Spring Framework 3, Hibernate 4, EhCache. Mamy problem z wyjątkowo długim czasem zbierania śmieci, który może potrwać 30 sekund lub dłużej, pozostawiając aplikację nie odpowiadającą.Niezwykle długie czasy zbierania śmieci
Obecnie jesteśmy w trakcie testowania, ale oprócz oczywistych: dodaj więcej pamięci, zastanawiałem się, czy istnieją aspekty, które możemy dostroić, aby skrócić czas zbierania śmieci.
Głównym czynnikiem wpływającym na wykorzystanie pamięci jest EHCache, ponieważ agresywnie buforujemy. Zawsze jednak trudno jest zmierzyć wielkość sklepów EHCache (nowe rozmiary bajtów EhCache, prowadzą do różnego rodzaju problemów z nami, ponieważ buforowane wykresy obiektów mogą być dość duże).
Są to moje ustawienia dla JVM
JAVA_OPTS="$JAVA_OPTS -server -Xms256m -Xmx704m XX:OnOutOfMemoryError=/usr/share/scripts/on_server_crash.sh -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/tomcat6 -XX:MaxPermSize=192m -XX:+UseConcMarkSweepGC
Czy otrzymujesz te długie czasy zanim pamięć osiągnie maksimum 704 MB? JVM może być nieco "agresywna" w próbach zredukowania używanej pamięci (i ewentualnie przeniesienia jej) przed podjęciem decyzji o zwiększeniu wykorzystywanej pamięci. Czy zachowuje się tak samo, jeśli uruchamiasz -Xms704m -Xmx704m? –
Używając "jstat -gc 1s pid" można sprawdzić, czy wykorzystanie pamięci trafia do szkółek, czy też należy zmienić przydział pamięci między żłobkami, eden i starszymi. –
Skrócony profil twojej aplikacji z JProdilfer/Yourkit, nie będziesz miał żadnych stałych sugestii. –