wiem, że nie jest to „najlepsze praktyki”, ale chciałbym wiedzieć, czy mogę automatyczny restart tomcat jeśli wdrożony aplikacja zgłasza OutOfMemory wyjątekMogę automatyczny restart tomcat JVM na z wyjątkiem pamięci
Odpowiedz
Można spróbować użyć opcji OnOutOfMemoryError JVM
-XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"
Możliwe jest również, aby wygenerować zrzut sterty dla późniejszej analizy:
-XX:+HeapDumpOnOutOfMemoryError
być ostrożnym przy połączeniu tych dwóch opcji. Jeśli wymusisz zabicie procesu w "tomcat-restart", zrzut sterty może nie być kompletny.
Rzeczywiście dostaję błąd permen z powodu przecieku classloader Zgaduję. Czy ta sama flaga działa również w tym scenariuszu? – Abe
Tak , będzie działać również na błąd przestrzeni permgen, – Dan
Ale jaka jest zawartość "tomcat-restart"? Czy to po prostu shutdown.bat, startup.bat? – Gullbyrd
nie łatwo , a zdecydowanie nie przez JVM, która właśnie przeżyła wyjątek z pamięci. Najlepszym rozwiązaniem byłoby połączenie monitora statusu tomcat ze skryptami cron lub powiązanymi skryptami administratora systemu; coś, aby sprawdzić stan serwera i automatycznie zatrzymać i ponownie uruchomić usługę, jeśli się nie udało.
Wygląda na to, że to ogólny konsensus ... :( – Abe
Generalnie nie. Maszyna wirtualna jest złym stanem i nie można jej całkowicie zaufać.
Zazwyczaj można użyć konfigurowalnego procesu otoki, który uruchamia i zatrzymuje "prawdziwą" maszynę wirtualną serwera. Przykładem Pracowałem już z jest „Java Usługa wrapper” z Tanuki Software http://wrapper.tanukisoftware.com/doc/english/download.jsp
Wiem, że są inni.
Po pierwsze, aby chronić się przed OOM, istnieją sposoby na instrumentowanie nowoczesnych maszyn wirtualnych za pomocą komponentów bean interfejsu w celu sprawdzania statusu sterty i innych struktur pamięci. Można ich użyć do, powiedzmy, ostrzeżenia w dzienniku lub e-mailu, jeśli niektóre operacje specyficzne dla aplikacji przesuwają określone ograniczenia.
Owijka Tanuki jest zdecydowanie najlepszym sposobem na przejście –
+1 w moim przypadku skrypt działał jako część XX: OnOutOfMemoryError = "/ yourscripts/tomcat-restart nie mógł przynieś tomcat kopię zapasową – Tomasz
Theres's także YAJSW twierdzi, że jest w pełni kompatybilny z JSW. Możesz spróbować, jeśli pasuje do twoich potrzeb (to open source), ale z mojego doświadczenia wynika, że JSW jest warta swojej ceny –
Wiem, że to nie jest to, o co prosiłeś, ale czy próbowałeś przeszukać zwałowisko sterty, aby zobaczyć, gdzie może wyciekać pamięć?
kilka bardzo przydatnych narzędzi do śledzenia wycieków pamięci:
jdk/bin/jmap -histo:live pid
To daje histogram wszystkich żywych obiektów obecnie w JVM. Szukaj dowolnego dziwnego obiektu. Będziesz musiał znać swoją aplikację całkiem dobrze, aby móc określić, jakie liczby obiektów są dziwne.
jdk/bin/jmap -dump:live,file=heap.hprof pid
Spowoduje to zrzucenie całego stosu maszyny JVM identyfikowanej przez pid. Następnie możesz użyć wspaniałego Eclipse Memory Analyzer, aby sprawdzić i sprawdzić, kto trzyma się odniesień do twoich obiektów. Twoimi dwoma największymi przyjaciółmi w Eclipse Memory Analyzer są gram histo i right click -> references -> exclude weak/soft references
, aby zobaczyć, co jest referencją do twojego obiektu.
jconsole to oczywiście kolejne dobre narzędzie.
Dzięki za Polecenie hprof, dobrze mieć to w arsenale ... :) Używam visualvm do takich rzeczy normalnie – Abe
Co powiesz na coś takiego? -XX:OnOutOfMemoryError="exec \`ps --no-heading -p $$ -o cmd\`"
Niestety, po zabiciu procesu Java. Twój skrypt zachowa odniesienie do portów tomcat 8080 8005 8009 i nie będziesz mógł go uruchomić ponownie z tego samego skryptu. Jedyny sposób, w jaki działa to dla mnie:
-XX: OnOutOfMemoryError = "kill -9% p", a następnie kolejny cron lub monit lub coś podobnego, aby zapewnić ponowne uruchomienie tomcat.
% p jest faktycznie paczką JVM, czymś, co zapewnia JVM.
- 1. Z wyjątkiem pamięci w matrycy
- 2. Domyślne wartości pamięci JVM
- 3. z wyjątkiem pamięci + analizującym pliku hprof zrzucić
- 4. Wersja Tomcat JVM inna niż JAVA_HOME
- 5. Z wyjątkiem pamięci w SQL 2008
- 6. Problemy z pamięcią JVM
- 7. Czy istnieje sposób na uniknięcie wycieków pamięci w systemie Tomcat?
- 8. Howto Monitoruj kilka aplikacji internetowych (z JMX) na serwerze Tomcat?
- 9. Dlaczego JVM tych serwerów Tomcat wykonuje pełną godzinę GC?
- 10. Apache2 restart zawiodły na ubuntu
- 11. Duży problem z zestawem danych EPPlus z wyjątkiem braku pamięci
- 12. Czy możemy wyświetlić obiekty w pamięci JVM?
- 13. Przydzielanie pamięci JVM w pojemniku Docker (LXC)
- 14. Czy mogę uruchomić Tomcat jako usługę do zrzucania sterty?
- 15. Iterowanie poprzez IQueryable z foreach skutkuje wyjątkiem braku pamięci
- 16. Restart Jenkinsa niewolnika od mistrza
- 17. wsadmin + jython restart WAS appserver
- 18. Restart R w Rstudio
- 19. Kompilacja JSP na ciąg lub w pamięci bytearray z Tomcat/Websphere
- 20. Jpeg restart markery
- 21. Dlaczego nowy relikwia spożywa dużo pamięci tomcat?
- 22. Jak mogę skonfigurować PHP z moim Tomcat
- 23. Attach JDB na nieprzechwyconego wyjątkiem
- 24. Co to jest ciągły restart aplikacji?
- 25. Automatyczny bufor jasne podczas korzystania z OpenGL na Androida
- 26. restart serwera mysql na Windows 7
- 27. Aplikacja "Restart ze statem" na kolbę
- 28. Wyłączanie lokalnych połączeń JMX na JVM
- 29. Automatyczny układ z UINavigationBar i UIBarButtonItem
- 30. Restart MySQL automatycznie po ubuntu na EC2 mikro instancja zabija go po wyczerpaniu pamięci
Prawidłowa odpowiedź brzmi, że autorzy Java nigdy nie powinni odrabiać możliwości OutOfMemoryErrors. Powinny zawsze zabijać maszynę wirtualną, a skrypt lub menedżer obsługiwałby ponowne uruchomienie. Co więcej, Tomcat również nie powinien ich łapać. – mikevdg