Parametry sterty JVM

Po przeczytaniu już zadanego pytania na ten temat i sporym googlowaniu nadal nie jestem w stanie mieć jasnego widoku opcji - XMS

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

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

Jedyną różnicą jest liczba śmieci, które zostaną uruchomione podczas uruchamiania mojej aplikacji i liczba alokacji pamięci. Mam rację ?

Oto moje powody tego odpowiedź:

Ustawienie opcji -Xms na 512m nie powoduje, że moja aplikacja używa naprawdę 512M fizycznej pamięci po uruchomieniu. Myślę, że jest to związane z nowoczesnym zarządzaniem pamięcią wirtualną systemu operacyjnego i leniwymi przydziałami stron. (Zauważyłem, że ustawienie -Xms na 512M lub na 64M nie zmienia w ogóle początkowej używanej pamięci zgłoszonej przez top na Linuksie lub przez Menedżera zadań na windows)

Czy ktoś może mi pomóc zrozumieć wpływ tej opcji Xms lub wskazać mi linki, które pomoże mi to zrozumieć?

Z góry dzięki

Manu

Author: icedwater, 2009-07-08

6 answers

Aby podsumować informacje znalezione po linku: JVM przydziela ilość określoną przez-Xms, ale system operacyjny zwykle nie przydziela prawdziwych stron, dopóki nie są potrzebne. Tak więc JVM przydziela pamięć wirtualną określoną przez Xms, ale przydziela pamięć fizyczną tylko tak, jak jest to potrzebne.

Możesz to zobaczyć używając Process Explorer przez Sysinternals zamiast Menedżera zadań w systemie windows.

Więc istnieje prawdziwa różnica między-Xms64M i-Xms512M. Ale myślę, że najważniejsze różnica jest taka, na którą już zwróciłeś uwagę: garbage collector będzie działał częściej, jeśli naprawdę potrzebujesz 512MB, ale dopiero zaczynał od 64MB.

 33
Author: Turismo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 11:31:54

JVM rozpocznie korzystanie z pamięci na początkowym poziomie sterty. Jeśli wartość maxheap jest wyższa, będzie ona rosła do rozmiaru maxheap, ponieważ wymagania pamięci przekraczają jej bieżącą pamięć.

Więc,

  • - Xms512m-Xmx512m

JVM zaczyna się od 512 M, nigdy nie zmienia rozmiaru.

  • - Xms64m-Xmx512m

JVM zaczyna się od 64M, rośnie (do max pułapu 512) jeśli mem. wymagania przekraczają 64.

 34
Author: Steve B.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 11:33:06

Poza standardowymi parametrami sterty -Xms i -Xmx dobrze jest również wiedzieć -XX:PermSize i -XX:MaxPermSize, które są używane do określania rozmiaru przestrzeni Gen Perm, ponieważ nawet jeśli możesz mieć miejsce w innej generacji w stercie, możesz zabraknąć pamięci, jeśli Twoja przestrzeń gen perm będzie pełna. Ten link ma również ładny przegląd niektórych ważne parametry JVM.

 14
Author: Seema Kiran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 02:11:32

JVM dostosowuje rozmiar sterty, co oznacza, że spróbuje znaleźć najlepszy rozmiar sterty dla Twojej aplikacji. -Xms i-Xmx po prostu określa zakres, w którym JVM może działać i zmieniać rozmiar sterty. Jeśli -Xms i-Xmx są tą samą wartością, to rozmiar sterty JVM pozostanie niezmienny przy tej wartości.

Zazwyczaj najlepiej jest ustawić -Xmx i pozwolić JVM znaleźć najlepszy rozmiar sterty, chyba że istnieje konkretny powód, dla którego musisz dać JVM dużą stertę podczas uruchamiania JVM.

As o ile JVM rzeczywiście żąda pamięci z systemu operacyjnego, wierzę, że zależy to od platformy i implementacji JVM. Wyobrażam sobie, że nie zażądałby pamięci, dopóki Twoja aplikacja tego nie potrzebuje. -Xmx i-Xms tylko rezerwują pamięć.

 5
Author: bajafresh4life,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-08 14:43:52

Jeśli napisałeś: - Xms512m-Xmx512m po uruchomieniu java przydziela w tym momencie 512M pamięci ram dla jego procesu i przechyłu.

- Xms64m-Xmx512m po uruchomieniu java przydziela tylko 64m pamięci ram dla swojego procesu, ale java może zwiększyć jego zajmowanie pamięci, podczas gdy 512m.

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

 4
Author: Tommaso Taruffi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-15 11:35:08

Stworzyłem ten przykład zabawki 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))
            }
        }
    }
}

Uruchomiłem go z:

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

I

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

Są z pewnością zauważalne pauzy w wersji -Xms500m. Jestem przekonany, że krótkie pauzy są zbiórkami śmieci, a długie są alokacjami sterty.

 0
Author: Akavall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-01 23:18:00