2009-07-08 16 views
59

Po czytania już zadawane pytanie na ten temat i dużo googlowania Wciąż nie jestem w stanie mieć jasny obraz -Xms opcjiJVM parametry kupie

Moje pytanie brzmi: jaka jest różnica między java -Xms=512m -Xmx=512m i java -Xms=64m -Xmx=512m ?

Na razie mam następującą odpowiedź:

Jedyna różnica jest w liczbie kolekcji śmieci, które będą uruchamiane podczas uruchamiania mojego wniosku oraz liczby alokacji pamięci. Czy mam rację ?

Oto moje powody tej odpowiedzi:

ustawienie opcji -Xms do 512m nie powoduje w mojej aplikacji przy użyciu naprawdę 512M pamięci fizycznej po starcie. Przypuszczam, że jest to związane z zarządzaniem nowoczesnymi pamięciami systemowymi OS i leniwymi alokacjami stron. (Zauważyłem, że ustawienie -Xms do 512M lub 64M nie zmienia się w ogóle początkowej pamięci używanych zgłaszane zarówno przez góry na Linux lub przez menedżera zadań Windows)

Czy ktoś może mi pomóc zrozumieć wpływ tego Xms opcją lub wskaż mi linki, które pomogą mi to zrozumieć?

góry dzięki

Manu

Odpowiedz

31

Podsumowanie informacji znalezionych po łączu: JVM przydziela ilość określoną przez -Xms, ale system operacyjny zazwyczaj nie przydziela stron rzeczywistych, dopóki nie są potrzebne. Tak więc JVM przydziela pamięć wirtualną określoną przez Xms, ale alokuje pamięć fizyczną, jaka jest potrzebna.

Można to zobaczyć za pomocą Eksploratora procesów Sysinternals zamiast Menedżera zadań w systemie Windows.

Tak więc istnieje prawdziwa różnica między używaniem -Xms64M a -Xms512M. Ale myślę, że najważniejszą różnicą jest ta, którą już wskazałeś: śmieciarz będzie działał częściej, jeśli naprawdę potrzebujesz 512 MB, ale zaczyna się dopiero od 64 MB.

+12

Myślę, że prawdziwa składnia to -Xms64m, a nie -Xms = 64m. Jeśli się mylę, wycofaj się! – Burkhard

+1

Przenieśli się przez to podczas badania niektórych drobniejszych punktów konfiguracji jvm. Przyjęta tu odpowiedź jest bardzo różna od mojego zrozumienia tych wartości. Tak, większość systemów operacyjnych będzie udostępniać fizyczne strony tylko wtedy, gdy zostanie wykryta drobna usterka strony, gdy aplikacja próbuje uzyskać dostęp do pamięci, którą ma malloc'ed - ale Xms określa początkową ilość pamięci malloced przez jvm - która umieszcza górną granicę na liczba stron, które można przypisać * bez * aplikacji malloc'ing więcej pamięci - aw przypadku Javy, to tylko malloc więcej pamięci (do Xmx), jeśli niewystarczająca ilość pamięci jest udostępniona przez gc – symcbean

+0

@symcbean Jestem zdezorientowany . Wygląda na to, że twoje zrozumienie wcale nie różni się od tego, co jest w odpowiedzi. Używasz tylko różnych słów, ale opisujesz dokładnie to samo zachowanie. – Turismo

4

jeśli napisał: -Xms512m -Xmx512m gdy go uruchomić, java przeznaczyć na te chwilę 512MB pamięci RAM dla procesu i jego przyrostu przechyłki.

-Xms64m -Xmx512m po uruchomieniu, java przyznaje tylko 64m pamięci RAM dla swojego procesu, ale java może zwiększyć jego pamięć zajętości podczas 512m.

Myślę, że druga rzecz jest lepsza, ponieważ dajesz java automatyczne zarządzanie pamięcią.

+0

Wiem o tym. Ale co dokładnie oznacza "Java przydzielić w tym momencie 512 m"? Ta pamięć nie jest skutecznie przydzielana, ponieważ mój system 512-bajtowy jest w stanie uruchomić kilka innych aplikacji bez zamiany i zaszkodzenia mnie, że tylko moja aplikacja java używa tylko kilku megabajtów. –

+1

Dlaczego zostało to odrzucone? Jest technicznie poprawny, z wyjątkiem ostatniego zdania, które może być poprawne lub nie. W świecie wysokiej wydajności jest zwykle mądrzejszy mieć java alokować całą pamięć, której będzie potrzebować za pomocą jednego brk(). W innych sytuacjach przydzielanie pamięci w miarę jej używania może być mądrzejsze. – Fredrik

+0

Ja sam nie cofnąłem tej odpowiedzi. Co do twojego komentarza, mam to samo pytanie, niż to, które zadałem dan: Czy istnieje jakieś "ryzyko" lub wada do ustawienia wartości Xms na taką samą wartość, jak Xmx? Dzięki Manu –

34

JVM rozpocznie się od użycia pamięci na początkowym poziomie sterty. Jeśli maxheap jest wyższa, wzrośnie do maksymalnego rozmiaru, ponieważ wymagania pamięci przekroczą jej bieżącą pamięć.

Więc

  • -Xms512m -Xmx512m

JVM zaczyna się od 512 m, nie zmienia rozmiar.

  • -Xms64m -Xmx512m

JVM rozpoczyna 64M, rośnie (maksymalnie do sufitu 512), jeżeli MEM. wymagania przekraczają 64.

+0

Wiem o tym. Ale jak powiedziałem w moim poprzednim komentarzu, co dokładnie oznacza "Java zaczyna się od użycia pamięci na początkowym poziomie sterty"?Ta pamięć nie wydaje się efektywnie przydzielona, ​​ponieważ mój system 512-bajtowy jest w stanie uruchomić kilka innych aplikacji bez wymiany i reprotu, że tylko kilka megabajtów jest używanych przez moją aplikację java. –

+3

Zazwyczaj ustawiasz początkowy rozmiar sterty na większą wartość, jeśli wiesz, że aplikacja przy uruchomieniu zużyje określoną ilość pamięci. Zapobiega to konieczności wykonania przez maszynę JVM czasu wykonania przy uruchamianiu, aby kilkakrotnie zmienić wielkość sterty. To szczególne zastosowanie jest bardzo powszechną optymalizacją, aby przyspieszyć działanie Eclipse, unikając kosztownego cyklu alokacji. – dhable

+0

Dziękuję za tę odpowiedź, która prowadzi mnie do tego innego pytania: Czy istnieje jakieś "ryzyko" lub wada do ustawiania wartości Xms na tę samą wartość niż Xmx? –

5

JVM dostosowuje wielkość sterty w sposób adaptacyjny, co oznacza, że ​​spróbuje znaleźć najlepszy rozmiar sterty dla danej aplikacji. -Xms i -Xmx po prostu określa zakres, w którym JVM może operować i zmieniać wielkość sterty. Jeśli -Xms i -Xmx mają tę samą wartość, wówczas wielkość sterty maszyny JVM pozostanie stała przy tej wartości.

Zazwyczaj najlepiej jest po prostu ustawić opcję -Xmx i pozwolić JVM znaleźć najlepszy rozmiar sterty, chyba że istnieje konkretny powód, dla którego należy udostępnić maszynę wirtualną JVM przy uruchamianiu JVM.

Jeśli chodzi o to, kiedy JVM faktycznie żąda pamięci z systemu operacyjnego, uważam, że zależy to od platformy i implementacji JVM. Wyobrażam sobie, że nie zażąda pamięci, dopóki twoja aplikacja tego nie potrzebuje. -Xmx i -Xms tylko rezerwuje pamięć.

14

Oprócz standardowych parametrów Heap -Xms i -Xmx to też dobrze wiedzieć -XX:PermSize i -XX:MaxPermSize, który jest używany do określenia wielkości przestrzeni Perm Gen bo choć można mieć miejsce w drugiej generacji w sterty można uruchomić z pamięci, jeśli Twoja przestrzeń perm perm jest pełna. Ten link ma również ładny przegląd niektórych important JVM parameters.

0

Stworzyłem ten przykład zabawkę w scala, my_file.scala:

object MyObject { 

    def main(args: Array[String]) { 
     var ab = ArrayBuffer.empty[Int] 

     for (i <- 0 to 100 * 1000 * 1000) { 
      ab += i 
      if (i % 10000 == 0) { 
       println("On : %s".format(i)) 
      } 
     } 
    } 
} 

Pobiegłem go:

scala -J-Xms500m -J-Xmx7g my_file.scala 

i

scala -J-Xms7g -J-Xmx7g my_file.scala 

Są z pewnością zauważalne przerwy w -Xms500m wersji. Jestem pewien, że krótkie pauzy są uruchomieniami czyszczenia pamięci, a długie są alokacją sterty.