Jak ustawić maksymalne wykorzystanie pamięci dla JVM?

138

Chcę ograniczyć maksymalną ilość pamięci używanej przez maszynę JVM. Uwaga, to nie tylko sterta, chcę ograniczyć całkowitą pamięć używaną przez ten proces.

erotsppa
źródło

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.

Prabhu R
źródło
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.

jjnguy
źródło
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

vsingh
źródło
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ć.

SmoothieMonster
źródło
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.

Mario Trucco
źródło
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