2010-01-31 16 views
10

Próbuję mieć Tomcat, który jest obecnie uruchomiony jako usługa w systemie Windows 2003, zrzut sterty na OutOfMemoryError.Czy mogę uruchomić Tomcat jako usługę do zrzucania sterty?

(Tomcat jest uruchomiony Hudson, który zgłasza problem przestrzeń sterty na końcu ogona mojego kompilacji. Uruchomienie build ręcznie nie wytwarza takiego błędu. Chłopaki Hudson potrzebować zrzut sterty aby rozpocząć.)

Zgodnie z instrukcją w innym miejscu, powiedziałem programowi Apache Service Monitor, aby skonfigurował maszynę JVM, której używa do uruchamiania Tomcata w celu zrzutu sterty, gdy napotkano numer OutOfMemoryError przez dodanie następujących opcji JVM: -XX: + HeapDumpOnOutOfMemoryError Następnie uruchamiam kompilację jeszcze raz. Rzeczywiście, zgłasza, że ​​wystąpił błąd sterty. Skanuję cały dysk szukając domyślnego pliku java_pid123.hprof (gdzie oczywiście 123 jest zastępowany przez PID JVM). Brak plików o numerach .hprof w dowolnym miejscu.

Jestem złapany w haczyk 22: Potrzebuję sterty sterty dla facetów Hudsona, aby naprawić ich wyciek pamięci, ale nie mogę dostać sterty sterty, jeśli prowadzę Hudson pod Tomcat.

Czy istnieje jakiś specjalny sposób, gdy Tomcat działa jako usługa systemu Windows, aby uzyskać zrzut sterty z niego na OutOfMemoryError?

Inna rzecz, którą próbowałem, to powiedzieć, na kartach Startup i Shutdown, aby użyć opcji "Java" zamiast opcji "jvm". Wierzę, że powinno to nakazać Menedżerowi usług, aby spróbował uruchomić Tomcat za pomocą polecenia wykonywalnego Java, zamiast bezpośrednio uruchamiać jvm.dll. Kiedy to zrobię, usługa się nie uruchomi.

Z pewnością ktoś inny miał podobny problem?

+0

Powinienem wspomnieć, że przywiązałem się do Tomcata z jconsole i zauważyłem, że użycie sterty nigdy nie przekracza 60MB. –

Odpowiedz

5

Po wreszcie oddanie tego jednego do łóżka, chciałam odpowiedzieć na to pytanie dla innych, którzy mogą mieć ten sam problem.

Po pierwsze, jeśli instalujesz Tomcat w systemie Windows, nie używaj instalatora .exe, mimo że jest on promowany przez Apache. Nie pozwoli ci uruchomić Tomcat jako czegoś innego niż konto systemowe, bez względu na to, co zrobisz. Wygląda na to, że konto systemowe nie ma uprawnień do zapisywania plików .hprof w bieżącym katalogu i żadne ulepszenia zabezpieczeń systemu Windows nie powodują zniknięcia tego problemu.

OK, więc zainstalowałeś Tomcat z dystrybucji .zip. Zainstaluj go jako usługę przy użyciu skryptu service.bat. Upewnij się, że jest ustawiony jako uruchamiany jako konkretny użytkownik, który został specjalnie stworzony do tego celu. Upewnij się również, że folder, do którego ma pisać Tomcat w przypadku zrzutu sterty, może być zapisywany przez tego użytkownika.

Edytuj plik service.bat, aby dołączyć opcje -XX:+HeapDumpOnOutOfMemoryError i -XX:HeapDumpPath=C:\whatever w odpowiednim miejscu (gdzie można umieścić opcje maszyny JVM). To powinno wystarczyć.

0

Pliki .hprof są po cenach dumpingowych w bieżącym katalogu. Dokładnie to, co oznacza dla usługi Windows, to domysły, zakładając, że to coś znaczy.

Sugeruję opublikowanie nowego pytania (na http://superuser.com) z pytaniem, co oznacza "katalog bieżący" dla usługi Windows.

+0

Obecny katalog, być może, ale nie ma pliku .hprof na komputerze. –

+0

Jest więc możliwe, że usługi Windows nie mają "bieżącego katalogu", a system Windows wyrzuca plik do pustej bazy. Moja sugestia, aby dowiedzieć się więcej o stoiskach usług Windows. – skaffman

+0

Monitor usługi twierdzi, że bieżący katalog to C: \ Program Files \ Apache Tomcat \ Tomcat 6.0. Napisałem serwlet, który wyprowadza plik do bieżącego katalogu, a plik pojawia się w tym katalogu. –

0

From 20 Tips for Using Tomcat in Production

Dodaj poniższe linie do swoich JAVA_OPTS w catalina.sh (lub catalina.bat dla Windows): - XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/j2ee/heapdumps

+0

Problem polega oczywiście na tym, że żaden monitor nie jest wywoływany przez monitor usługi. –

0

jeśli zainstalowałeś tomcat z .exe możesz skonfigurować usługę tomcat do korzystania z konta innego niż lokalne konto systemowe i możesz przypisać te prawa użytkownika do katalogu "c: \ whatever", w którym tworzysz plik zrzutu. jedna rzecz do zapamiętania, że ​​usługa tomcat nie działa z kontem mającym uprawnienia administracyjne. więc utwórz prostego użytkownika w systemie Windows (członek grupy użytkowników) i ustaw usługi tomcat dla użytkownika tego konta. i przyznać prawa użytkownika w katalogu "c: \ whatever". To rozwiązuje problem praw katalogów użytkowników, ale musisz skonfigurować tomcat dla błędów zrzutu pamięci.

0

Kiedy proces java działa jako usługa okien można wygenerować heapdump pomocą poniższego krokach

  1. Uruchom konsolę poleceń jako administrator
  2. wersja JDK (na komendzie jmap) i JRE (środowisko aplikacji run Java) powinny być takie same.
  3. Uzyskaj PID bez prowadzenia procesu okna dla tej aplikacji Java z menedżera zadań
  4. Wykonaj poniżej polecenia

jmap -dump: file = d: \ heapdump \ myHeapDump.hprof -F #PID_No #

Jeśli dostał każdy wyjątek z JDK/JRE 7 spróbuj to samo z JDK/JRE 8 Właściwie wychodził jakiś problem w jmap z JDK 7, ale gdy przeniósł się do JDK 8, ja byliśmy w stanie skutecznie generować zrzut sterty za pomocą tego samego polecenia:

Powiązane problemy