Zwiększenie maksymalnej wielkości sterty maszyny JVM dla aplikacji intensywnie korzystających z pamięci


88

Muszę uruchomić aplikację intensywnie wykorzystującą pamięć Java, która zajmuje więcej niż 2 GB, ale mam problemy ze zwiększeniem maksymalnego rozmiaru sterty. Do tej pory próbowałem następujących podejść:

  • Ustawienie parametru -Xmx, np. -Xmx3000m. To podejście zawodzi podczas tworzenia maszyny JVM. Z tego, co wygooglowałem, wygląda na to, że -Xmx musi mieć mniej niż 2 GB.

  • Korzystanie z opcji -XX: + AggressiveHeap . Kiedy próbuję tego podejścia, pojawia się błąd „Za mało pamięci”, który informuje, że rozmiar sterty wynosi 1273,4 MB, mimo że mój komputer ma 8 GB pamięci.

Czy jest inne podejście, które mogę spróbować zwiększyć maksymalny rozmiar sterty maszyny JVM? Oto podsumowanie specyfikacji komputera:

  • System operacyjny: Windows 7 (64-bitowy)
  • Procesor: Intel Core i7 (2,66 GHz)
  • Pamięć: 8 GB
  • java -version:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
BTW: Minimalny i maksymalny rozmiar pamięci są teraz standardowymi opcjami. Możesz użyć -ms i -mx zamiast -Xms i -Xmx. -X ?? jest zarezerwowany dla niestandardowych opcji.
Peter Lawrey

2
Standard dla której maszyny JVM? Nadal są niestandardowe dla HotSpot JVM (od 1.8). Zobacz docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle

-mx i -ms istnieją i działają, ale nie mogę ich znaleźć w oficjalnej dokumentacji java @PeterLawrey> czy możesz dodać link do dokumentacji? Dzięki
Michal Bernhard

2
@MichalBernhard to wsteczna kompatybilność z Javą 1.1. Widziałem to udokumentowane dla tej wersji, ale może być teraz trudne do znalezienia. ;)
Peter Lawrey,

1
Dzięki @PeterLawrey za wyjaśnienie. Ale kiedy mówisz, że jest teraz standardem, masz na myśli, że jest standardem z Java 1.1 (ale nie jest dokumentem w późniejszych wersjach)? Wydaje się dziwne :) btw znalazłem link do dokumentacji Javy 1.1 i masz rację: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michał Bernhard

Odpowiedzi:



96

W przypadku używania maszyny JVM w trybie 32-bitowym maksymalny rozmiar sterty, który można przydzielić, wynosi 1280 MB. Tak więc, jeśli chcesz wyjść poza to, musisz wywołać JVM w trybie 64.

Możesz użyć następujących:

$ java -d64 -Xms512m -Xmx4g HelloWorld

gdzie,

  • -d64: włączy 64-bitową maszynę JVM
  • -Xms512m: Ustawia początkowy rozmiar sterty na 512 MB
  • -Xmx4g: Ustawia maksymalny rozmiar sterty na 4 GB

Możesz dostroić -Xms i -Xmx zgodnie ze swoimi wymaganiami (YMMV)

Bardzo dobre źródło informacji na temat dostrajania wydajności JVM, do którego warto zajrzeć: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


Moja maszyna JVM jest 32-bitowa i dopuszcza maksymalnie -Xmx1024M. Spróbuję także wersji 64-bitowej.
kiltek

Próbowałem 64-bitowej JVM i działało idealnie. Teraz mogę ustawić 4096 MB maksymalnego rozmiaru sterty. Jeśli masz zainstalowane zarówno 32, jak i 64 bity, przynajmniej w systemie Windows musisz wskazać ścieżkę Java dla swoich aplikacji do zainstalowanej nowej wersji 64-bitowej. W przeciwnym razie błąd będzie się powtarzał. W systemie Windows często można to zrobić, zmieniając ścieżkę Java w zmiennych środowiskowych systemu.
Fabiano

Domyślam się, że limit maksymalnej sterty nie wynosi 1280, ale coś w pobliżu 1700 MB. Użyłem 1600 MB maksymalnej sterty na mojej 32-bitowej instalacji JVM i działało dobrze.
Fabiano

jaki jest argument HelloWorld w Twoim poleceniu? jak mogę użyć tego polecenia, jeśli chcę ustawić maksymalny poziom procesu Java uruchamianego za pomocą polecenia java -jar myApp.jar w systemie Linux?
LordScone

Cześć, czy mogę zapytać, jaki jest maksymalny rozmiar sterty Java, jaki mogę ustawić? Kiedy uruchamiam aplikację, domyślny -Xmx na moim komputerze ma 4 GB, ale czy mogę ustawić go więcej niż 4 GB?
Ock

14

Uważam, że limit 2 GB dotyczy 32-bitowej wersji Java. Myślałem, że wersja 1.6 była zawsze 64-bitowa, ale spróbuj wymusić tryb 64-bitowy tylko po to, aby zobaczyć: dodaj opcję -d64.


Opcja -D64 nie zadziałała, spróbuję użyć 64-bitowej maszyny JVM, jak zasugerował GregS i przedstawię wyniki.
Alceu Costa,

1
Przełączniki -d64 i -d32 działają poprawnie tylko w systemie Solaris (przynajmniej zgodnie z tą dokumentacją): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Łukasz Stelmach

Próbowałem z obiema opcjami. Z -d64 maszyna JVM nie uruchamia się, nawet jeśli nie określę opcji Xmx. -D64 działa tylko wtedy, gdy nie określam Xmx.
Alceu Costa,

Wydaje się, że @Lukasz -d64 i -d32 również działają na JVM firmy Apple. Jednak ten dokument wydaje się sugerować, że nie działają one w przypadku maszyn JVM firmy Sun dla systemów Windows i Linux.
G__,

8

32-bitowa Java jest ograniczona do około 1,4 do 1,6 GB.

Często zadawane pytania dotyczące sterty 32-bitowej Oracle

Zacytować

Maksymalny teoretyczny limit sterty dla 32-bitowej maszyny JVM to 4G. Ze względu na różne dodatkowe ograniczenia, takie jak dostępna wymiana, wykorzystanie przestrzeni adresowej jądra, fragmentacja pamięci i obciążenie maszyny wirtualnej, w praktyce limit może być znacznie niższy. W większości nowoczesnych 32-bitowych systemów Windows maksymalny rozmiar sterty będzie wynosić od 1,4 GB do 1,6 GB. W 32-bitowych jądrach Solaris przestrzeń adresowa jest ograniczona do 2G. W 64-bitowych systemach operacyjnych z 32-bitową maszyną wirtualną maksymalny rozmiar sterty może być większy, zbliżając się do 4G w wielu systemach Solaris.


4

Poniżej conf działa dla mnie:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.