Zużycie pamięci JVM

9

Próbuję uruchomić tomcat na systemie z małą ilością pamięci (150-256 Mb). Mimo że JVM uruchamiam z -Xmx64m (który i tak powinien być domyślny), proces natychmiast zajmuje 200 MB +.

Zastanawiam się, dlaczego JVM potrzebuje tak dużo pamięci, czy istnieje sposób na jej dostrojenie? Czy inne maszyny JVM są lepsze od Słońca pod względem niskiego zużycia pamięci - i czy działają z tomcat?

Draemon
źródło

Odpowiedzi:

5

Oprócz sterty (określonej przez -Xmsi -Xmx) należy uwzględnić obszary inne niż sterty. Obejmują one

  • Perm Gen, czyli 64 MB w systemach 32-bitowych i początkowo 96 MB w systemach 64-bitowych
  • Pamięć podręczna kodów, która wynosi od 20 do 40 MB w zależności od JVM
  • Obszar bufora NIO (z którego DirectByteBufferczerpane są s), początkowo jest to 64mb

Jest też przestrzeń robocza samej JVM, która będzie miała kilkadziesiąt mb.

Należy również pamiętać o automatycznym dostosowywaniu Sun JVM podczas korzystania z maszyny klasy serwerowej . Z czasem definicja klasy serwera (pamięć 2 Gb, więcej niż jeden rdzeń) uległa pewnej deprecjacji i obecnie większość maszyn jest w stanie uruchomić -serveroptymalizacje. Moja rada jest zawsze do określenia -Xmsi -Xmxustawienia i przejść -server, chyba że można pomyśleć o dobrym powodu nie zbyt.

Dave Cheney
źródło
Uważaj także na pamięć wirtualną, którą JVM rezerwuje tylko i jeszcze nie używa.
Steve Schnepp
To prawda, że ​​większość tych segmentów, takich jak PermGen i pamięć podręczna kodów, są przydzielane podczas uruchamiania, ale większość jąder będzie unikać przydzielania stron do tych segmentów, dopóki nie będą potrzebne.
Dave Cheney
1
Dzięki za informację - myślę, że to wyjaśnia, dokąd zmierza pamięć. Czy istnieje sposób na zmianę tych wartości? Jeszcze lepszy byłby sposób sprawdzenia, ile z każdej sekcji było w użyciu - nie wiem, czy którekolwiek z narzędzi do debugowania / monitorowania Java pozwala ci to zrobić?
Draemon
1
Możesz użyć pmap lub jmap, aby uzyskać wyobrażenie o różnych używanych segmentach. Większość typowych opcji (i ich domyślne) znajduje się tutaj, java.sun.com/javase/technologies/hotspot/vmoptions.jsp . Zmieniają się często i podlegają różnicom w systemie operacyjnym (zwykle rozmiar stosu) i arch (64-bitowy system operacyjny zwykle implikuje większe obszary JVM)
Dave Cheney
3

Dzięki opcji -Xmx ograniczasz wielkość sterty zarezerwowanej przez JVM ... Istnieją dodatkowe zasoby, których JVM potrzebuje ...

„Dzięki za pamięć” * to dobry artykuł wyjaśniający, w jaki sposób JVM wykorzystuje pamięć ...

Oprócz tego możesz wypróbować JVM IBM, powinien on współpracować z Tomcat, nie wiem czy niektóre z darmowych implementacji JVM działają.

Niemniej jednak nie sądzę, że maszyna z tak niską pamięcią przyniesie ci jakieś korzyści. Java potrzebuje tylko pamięci.

* Ponieważ nowi użytkownicy nie mogą przesyłać hiperłączy, musisz sam przejrzeć ten artykuł ... jest to pierwszy hit w Google dla „dzięki za pamięć IBM”.

dertoni
źródło
3
ibm.com/developerworks/java/library/j-nativememoryorylinlin - Link do artykułu „Dzięki za pamięć”
StackKrish
0

Jedną przydatną techniką, którą znalazłem, jest użycie monitorowania JMX, aby zobaczyć dokładnie, ile pamięci jest używane przez stertę w porównaniu do przestrzeni permgenowej.

Skonfiguruj JMX w Tomcat zgodnie z opisem tutaj http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Następnie użyj JConsole (dostarczany z JDK 5 lub JDK 6) - znacznik pamięci będzie śledził zużycie pamięci w czasie.

Ponadto - uważaj na miękkie ponowne uruchamianie aplikacji internetowych. Jeśli przeładujesz aplikację internetową, przestrzeń permgenowa nie będzie gromadzona i będzie się z czasem powiększać. Musisz zrobić pełny przystanek / start Tomcata, aby odzyskać przestrzeń permgenową.

Will Glass
źródło
Można także użyć VisualVM zamiast JConsole i podać jeszcze więcej szczegółów, gdy szuka się problemów z pamięcią w JVM. Musiałem użyć tego więcej niż raz, aby znaleźć problemy.
Jeremy Bouse