Jak ustawić maksymalne wykorzystanie pamięci dla JVM?


Odpowiedzi:


97

użyj argumentów -Xms<memory> -Xmx<memory>. Użyj Mlub Gpo liczbach do wskazania odpowiednio Megs i Gigabitów bajtów. -Xmswskazuje minimum i -Xmxmaksimum.


1
możesz również spojrzeć na MaxPermSize.
urmalp

92
pyta o pamięć JVM. To, co powiedziałeś, to rozmiar sterty. Obaj są różni
vsingh

8
Aby powtórzyć to, o czym wspominają inne komentarze, Xms i Xmx konfigurują tylko stertę. Chociaż konfigurowanie tych zmiennych ma pośredni wpływ na non-sterty przestrzeni, osoba wnioskująca pytanie stara się ustalić, czy istnieje sposób, aby skonfigurować całkowitego zużycia pamięci (sterty + non-sterty)
murungu

2
uhu. więc ustawiłem -Xmx524Mi proces zajmuje 1,2 GB pamięci RAM. (?)
phil294

7
To nie jest poprawna odpowiedź, opcje -Xms i -Xmx regulują tylko rozmiar sterty jvm, a nie całkowitą alokację pamięci.
Peter De Winter,

31

Nie powinieneś martwić się o wyciek pamięci ze stosu (jest to bardzo rzadkie). Jedyny przypadek, w którym stos wymknie się spod kontroli, to nieskończona (lub naprawdę głęboka) rekurencja.

To tylko kupa. Przepraszamy, na początku nie przeczytałem w pełni Twojego pytania.

Należy uruchomić maszynę JVM z następującym argumentem wiersza poleceń.

-Xmx<ammount of memory>

Przykład:

-Xmx1024m

Umożliwi to maksymalnie 1 GB pamięci dla maszyny JVM.


1
To nie jest prawda, według tego wątku, istnieje wiele sposobów można wyciekać poza sterty stackoverflow.com/questions/1475290/...
erotsppa

Masz rację, jest wiele sposobów na problemy z pamięcią niezwiązane ze stosem. Jednak nie są one zbyt częste.
jjnguy

10
Jestem pewien, że nie możesz kontrolować rozmiaru pamięci innej niż sterta, prawda?
mat b

Jestem prawie pewien, że możesz to kontrolować przez -XX:MaxDirectMemorySize. Nie żebym mocno profilował, ale nadal;)
alexandergunnarson

2
@alexandergunnarson MaxDirectMemorySizeJedyny wpływa na bufory NIO. Maszyna JVM używa wszelkiego rodzaju innej pamięci natywnej.
Christopher Schultz

16

Jeśli chcesz ograniczyć pamięć dla jvm (nie rozmiar sterty), ulimit -v

Aby dowiedzieć się, jaka jest różnica między pamięcią jvm i sterty, zapoznaj się z tym doskonałym artykułem http://blogs.vmware.com/apps/2011/06/taking-a-closer-look-at-sizing-the- java-process.html


8
Czy jest ulimitto polecenie systemu Linux? Przeprowadziłem szybkie wyszukiwanie w Google i nie zauważyłem żadnego związku między ulimita JVM. Y
Sam


JVM nie radzi sobie dobrze z przekroczeniem ustawionego w ten sposób limitu
Jimmy RT

11

Powyższa odpowiedź jest w pewnym sensie poprawna, nie można z wdziękiem kontrolować, ile pamięci natywnej przydziela proces Java. To zależy od tego, co robi Twoja aplikacja.

To powiedziawszy, w zależności od platformy, możesz użyć jakiegoś mechanizmu, na przykład ulimit, aby ograniczyć rozmiar javy lub innego procesu.

Po prostu nie oczekuj, że zawiedzie z wdziękiem, jeśli osiągnie ten limit. Błędy alokacji pamięci natywnej są znacznie trudniejsze do obsłużenia niż awarie alokacji na stercie java. Istnieje dość duża szansa, że ​​aplikacja ulegnie awarii, ale w zależności od tego, jak ważne jest dla systemu, aby zmniejszyć rozmiar procesu, który nadal może Ci odpowiadać.


1

NativeHeap można zwiększyć o -XX: MaxDirectMemorySize = 256M (domyślnie 128)

Nigdy go nie używałem. Może uznasz to za przydatne.


1
Wątpię, czy op chciał tego: pamięć natywna jest używana, gdy wywołujesz kod C / C ++ z javy.
om-nom-nom

6
pamięć własna jest również używana podczas wykonywania wywołań nio, jeśli alokujesz bufory za pomocą pamięci bezpośredniej. (... i programy ładujące i informacje o wątkach ....)
stu
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.