W Twojej sytuacji, na ile instancji JVM rozłożone jest te 20 war'ów (innymi słowy ile serwerów WS jest wykreowanych w ramach instalacji WS)?
Jeśli na 1 to słabo, bo 1 gó****na aplikacja będzie wpływać na pozostałe. Jeśli w ramach WS, masz faktycznie 1 serwer, to możesz:
- wykreować 2 dodatkowe serwery (będą miały dedykowane procesy JVM)
- z 20 war z servera A, 10 przenosisz na server B i czekasz
- jak jest lepiej na A, a na B się robi źle -> połowę z B przenosisz na C i masz już tylko 5 aplikacji podejrzanych
- itd.
W końcu zostajesz z 1 aplikacją i np. odkrywasz, że ustawiłeś jakiś session timeout na 3600 myśląc, że to sekundy, a to były minuty...
Ogólnie w takich problemach staram się:
A) zadać kilka prostych pytań i zrozumieć tło sytuacji.
- Czy "kiedyś było lepiej" (nie restartowaliście WS) ?
- Od kiedy zaczęło się "źle dziać"? (po dorzuceniu 20-tego wara, po zaaplikowaniu
bleedeing edge patch
dla WS, po aktualizacji kernela, po hot fixie aplikacji X, ... )
- Skąd przekonanie, że to wyciek pamięci?
- Ile zasobów powinieneś mieć do obsługi tych 20 aplikacji? (może zwyczajnie jest za mało zasobów do obsłużenia workloadu?)
B) zrozumieć w jakim stanie jest serwer, na którym jest WS zainstalowany
- zbieranie danych i ich wizualizacja - najczęściej nmon jako zbieracz danych + nmon ANalyser do graficznego przeglądania.
- z tego wyciągnięcie wniosków, który zasób jest zajęty i szukanie procesu, który generuje obciążenie dla tego zasobu
C) analizować proces, który jest problematyczny
Zazwyczaj dedykowane narzędzia (np. do bazy danych, do JVM, )
Czasem ogólne narzędzia - strace, pstack, perf, ...
Analiza ma na celu zrozumienie gdzie są "waity" , jak wygląda "łańcuch oczekiwania" i ile czasu trwa obsługa żądań do zasobu.
Jak już wiadomo co jest na początku łańcucha, to ten proces brany jest za cel do dalszej analizy.
Możesz podpiąć się pod JVM jakimś toolem wspomnianym przez @jarekr000000 czy @Shalom i zobaczyć co się dzieje. Tylko, do której instancji JVM? Chyba, że masz 1, to wtedy patrz początek posta :-)