Varsayılan maksimum Java yığın boyutu nasıl belirlenir?


421

-XmxnSeçeneği Java komut satırından çıkarırsam, varsayılan bir değer kullanılır. Java belgelerine göre

"varsayılan değer çalışma zamanında sistem yapılandırmasına göre seçilir"

Hangi sistem yapılandırma ayarları varsayılan değeri etkiler?


1
sistem yapılandırması şu anlama gelir: a) istemci jvm vs sunucu jvm b) 32bit vs 64bit. Bağlantılar: 1) J2SE5.0'dan güncelleme docs.oracle.com/javase/6/docs/technotes/guides/vm/… 2) kısa cevap: docs.oracle.com/javase/8/docs/technotes/guides/vm / gctuning /… 3) ayrıntılı cevap: docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/… 4) istemci vs sunucu: javacodegeeks.com/2011/07/jvm-options-client- vs-
server.html

2
yukarıdaki bağlantılardan anlamak zor. Bunları burada özetlemek gerekirse: İstemci jvm'si için maksimum yığın boyutu 256mb'dir (bir istisna vardır, yukarıdaki bağlantılardan okuyun). 32bit Server jvm için Maximun yığın boyutu 1gb ve 64 bit 32gb'dir (yine burada da istisnalar vardır. Lütfen bağlantılardan okuyun). Yani 256mb veya 1gb veya 32gb
Vyshnav Ramesh Thrissur

Yanıtlar:


507

Windows'ta, uygulamalarınızın çalıştığı sistemdeki varsayılanları bulmak için aşağıdaki komutu kullanabilirsiniz.

java -XX: + PrintFlagsFinal-sürüm | findstr HeapSize

MaxHeapSize(For -Xmx) ve InitialHeapSizefor seçeneklerini arayın -Xms.

Unix / Linux sisteminde şunları yapabilirsiniz:

java -XX: + PrintFlagsFinal-sürüm | grep HeapSize

Elde edilen çıktının bayt cinsinden olduğuna inanıyorum.


3
Böyle güzel bir seçenek umuyordum, ancak IBM'in Java 6 VM'sini kullanarak benim için çalışmadı.
Matt Lavin

Harika! Tüm bu varsayılan seçeneklerle oynayabilir miyim? Her biri için karşılık gelen ENV değişkeni nedir?
Elist

28
Benim durumumda Linux InitialHeapSize = 262803264ve yanılmıyorsam MaxHeapSize = 4206886912yaklaşık 256 MB ve 4 GB . Bu, her JVM'nin -Xms256m -Xmx4gseçeneklerle başlatıldığı gibi başladığı anlamına mı geliyor ?
Yuriy Nakonechnyy

9
Bir Windows sisteminde:java -XX:+PrintFlagsFinal -version | findstr /R /C:"HeapSize"
sp00m

1
@matanster Linux'umdaki -versionuzun "kullanım" metnini bastırıyor stderr.
Franklin Yu

115

Java SE 5 için: Çöp Toplayıcı Ergonomisine Göre [Oracle] :

ilk yığın boyutu:

Makinenin fiziksel belleğinin 1 / 64'ü daha büyük veya makul bir minimum. J2SE 5.0'dan önce, varsayılan ilk yığın boyutu platforma göre değişen makul bir minimumdur. -Xms komut satırı seçeneğini kullanarak bu varsayılanı geçersiz kılabilirsiniz.

maksimum yığın boyutu:

Fiziksel belleğin 1 / 4'ü veya 1 GB'den daha küçük. J2SE 5.0'dan önce, varsayılan maksimum yığın boyutu 64 MB'dı. -Xmx komut satırı seçeneğini kullanarak bu varsayılanı geçersiz kılabilirsiniz.

GÜNCELLEME:

Tom Anderson'ın yorumunda da belirtildiği gibi, yukarıdakiler sunucu sınıfı makineler içindir. Dan 5.0 JavaTM Virtual Machine Ergonomi :

J2SE platformunun 5.0 sürümünde, sunucu sınıfı makine olarak adlandırılan bir makine sınıfı, aşağıdakileri içeren bir makine olarak tanımlanmıştır:

  • 2 veya daha fazla fiziksel işlemci
  • 2 veya daha fazla Gbyte fiziksel bellek

Windows işletim sisteminin bir sürümünü çalıştıran 32 bit platformlar hariç. Diğer tüm platformlarda varsayılan değerler 1.4.2 sürümü için varsayılan değerlerle aynıdır.

J2SE platformunun 1.4.2 sürümünde varsayılan olarak aşağıdaki seçimler yapılmıştır

  • İlk yığın boyutu 4 Mbayt
  • maksimum yığın boyutu 64 Mbayt

4
Uyarı: bu istemci sınıfı makineler için değil, sunucu sınıfı makineler için geçerlidir. Bu belgeyi , bu terimleri ve istemci sınıfı makinelere ne olduğunu tanımlayan java.sun.com/docs/hotspot/gc5.0/ergo5.html ile birlikte okumalısınız . dogbane, alçakgönüllülükle ilgili pasajları alıntılamak için cevabınızı düzenlemenizi önerir miyim?
Tom Anderson

3
Bu, 2012'de gülünç derecede düşük bir varsayılan. Çok az ciddi uygulama 64 megabayt içine sığacak.
Mark E. Haase

1
Java 6 güncellemesi 18'den sonra istemci makineleri için Ernesto'nun 30 Ekim 2012 yanıtına bakınız.
Andy Thomas

Ayrıca şunu da unutmayın: "Öbek boyutu için verilen sınırlar ve kesirler J2SE 5.0 için doğrudur. Sonraki sürümlerde bilgisayarlar daha güçlü hale geldikçe farklı olmaları muhtemeldir."
Lodovik

Bu arada, bu algo sadece Paralel Çöp Toplayıcı içindir.
Mike Argyriou

45

Java 8 den fazla sürer 1 / 64. sizin için fiziksel bellek Xmssize (Minimum HeapSize) ve daha az 1 / 4th sizin için fiziksel bellek -Xmxsize (Maksimum HeapSize).

Varsayılan Java yığın boyutunu aşağıdakileri yaparak kontrol edebilirsiniz :

In Windows'un :

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

In Linux :

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

Hangi sistem yapılandırma ayarları varsayılan değeri etkiler?

Makinenin fiziksel belleği ve Java sürümü.


5
1/6 yerine 1/64 değil mi?
Vyshnav Ramesh Thrissur

1
Evet Xmssize (Minimum HeapSize / InitialHeapSize) fiziksel belleğinizin 1 / 64'ünden fazla ve Xmxsize (Maksimum HeapSize / MaxHeapSize) fiziksel belleğinizin 1 / 64'ünden az. (Mac'im için ex, 16GB ram'a sahip, uintx alıyorum InitialHeapSize: = 268435456 {product} uintx MaxHeapSize: = 4294967296 {ürün}, i, e Xms 268 MB ve Xmx 4.29 GB
sjethvani

1
Lütfen cevabı düzenleyin. 1/6, değil 1/6.
emeraldhieu

35

Bu, Java 6 güncelleme 18'de değiştirilmiştir .

1 GB'den fazla fiziksel belleğe sahip olduğumuzu varsayarsak (bu günlerde oldukça yaygındır), sunucu vm için her zaman fiziksel belleğinizin 1 / 4'üdür.


8
Yanlış, bağlantılı sayfa diyorgreater than or equal to 1 gigabyte of physical memory results in a maximum heap size of 256 megabytes
Paolo Fulgoni

5
Az önce 5GB fiziksel belleğe sahip bir linux makinesini kontrol ettim. Varsayılan maksimum yığın 1,5 GB olarak gösterilir
ernesto

1
@PaoloFulgoni hayır, şu anda gözlemlediğim bir diğer pratik örnek: 129 Gbyte fiziksel bellek sonucu 32 Gbyte maksimum yığın boyutu ile sonuçlanır
Kirill


16

Ernesto haklı. Yayınladığı bağlantıya göre [1]:

Güncellenmiş İstemci JVM yığın yapılandırması

Müşteri JVM'sinde ...

  • Varsayılan maksimum yığın boyutu, fiziksel belleğin yarısı 192 megabayt fiziksel belleğe, aksi takdirde fiziksel belleğin dörtte biri 1 gigabayt fiziksel belleğe kadar.

    Örneğin, makinenizde 128 megabayt fiziksel bellek varsa, maksimum yığın boyutu 64 megabayttır ve 1 gigabayt fiziksel belleğe eşit veya daha büyükse, maksimum yığın boyutu 256 megabayt ile sonuçlanır.

  • Programınız gerektirecek kadar nesne oluşturmadıkça, maksimum yığın boyutu JVM tarafından gerçekte kullanılmaz. İlk yığın boyutu olarak adlandırılan çok daha küçük bir miktar, JVM başlatma sırasında tahsis edilir. ...

  • ...
  • Sunucu JVM yığın yapılandırma ergonomisi artık İstemci ile aynıdır, ancak 32 bit JVM'ler için varsayılan maksimum yığın boyutu 4 gigabayt ve 64 bit JVM'ler için 32 gigabayt , karşılık gelen 32 gigabayttır. 128 gigabaytlık fiziksel bellek boyutuna kadar.

[1] http://www.oracle.com/technetwork/java/javase/6u18-142093.html



8

En sonunda!

Java 8u191'den itibaren artık seçenekleriniz var:

-XX:InitialRAMPercentage
-XX:MaxRAMPercentage
-XX:MinRAMPercentage

öbeği kullanılabilir fiziksel RAM'in yüzdesi olarak boyutlandırmak için kullanılabilir. (ki RAM'in çekirdeğin kullandığından daha az yüklü olmasıyla aynıdır).

Java8 u191 için Sürüm Notlarına bakın fazla bilgi için bkz. için . Seçeneklerin bir Docker başlığı altında belirtildiğini, ancak Docker ortamında veya geleneksel bir ortamda olsanız da geçerli olduklarını unutmayın.

İçin varsayılan değer MaxRAMPercentage % 25'tir. Bu son derece muhafazakârdır.

Kendi kuralım: Eğer ana makineniz verilen java uygulamasını çalıştırmak için az çok kendini adamışsa, sorun olmadan önemli ölçüde artabilirsiniz. Linux'taysanız, sadece standart cinleri çalıştırıyor ve RAM'i 1 Gb ve üstü bir yerden yüklediyseniz, JVM'nin yığını için% 75'i kullanmaktan çekinmeyin. Yine, bunun RAM yüklü değil, kullanılabilir RAM'in% 75 olduğunu unutmayın. . Geriye kalan, ana bilgisayarda çalışan diğer kullanıcı arazi işlemleri ve JVM'nin ihtiyaç duyduğu diğer bellek türleri (örn. Yığın için). Hep birlikte, bu genellikle kalan% 25'e güzelce uyacaktır. Açıkçası, daha fazla kurulu RAM ile% 75 daha güvenli ve daha güvenli bir bahistir. (Keşke JDK milletinin bir merdiven belirtebileceğiniz bir seçenek uygulamış olmasını dilerim)

MaxRAMPercentageSeçeneği ayarlamak şöyle görünür:

java -XX:MaxRAMPercentage=75.0  ....

Bu yüzde değerlerinin 'çift' tipte olduğunu ve bu nedenle bunları ondalık nokta ile belirtmeniz gerektiğini unutmayın . "75.0" yerine "75" kullanırsanız biraz garip bir hata alırsınız.


7

sistem yapılandırmasına bağlı olarak çalışma zamanında varsayılan değer seçilir

Belgeler sayfasına göz atın

Varsayılan Öbek Boyutu

Başlangıç ​​ve maksimum yığın boyutları komut satırında belirtilmedikçe, bunlar makinedeki bellek miktarına göre hesaplanır.

  1. İstemci JVM Varsayılan Başlangıç ​​ve Maksimum Öbek Boyutları:

    Varsayılan maksimum yığın boyutu, fiziksel belleğin 192 megabayt (MB) boyutuna kadar, aksi halde fiziksel belleğin dörtte biri 1 gigabayt (GB) boyutuna kadar .

  2. Sunucu JVM Varsayılan Başlangıç ​​ve Maksimum Öbek Boyutları:

    32 bit JVM'lerde, 4 GB veya daha fazla fiziksel bellek varsa, varsayılan maksimum yığın boyutu 1 GB'a kadar çıkabilir . 64 bit JVM'lerde, 128 GB veya daha fazla fiziksel bellek varsa, varsayılan maksimum yığın boyutu 32 GB'a kadar çıkabilir

Hangi sistem yapılandırma ayarları varsayılan değeri etkiler?

Başlangıç ​​ve maksimum yığın boyutlarını -Xms (başlangıç ​​yığın boyutu) ve -Xmx (maksimum yığın boyutu). Uygulamanızın ne kadar yığın yığınının iyi çalışması gerektiğini biliyorsanız, -Xms ve -Xmx değerlerini aynı değereayarlayabilirsiniz


5

XmsVe XmxJava sanal makinesinin olan bayrak (JVM):

  • Xms: initial and minimumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • -server modu:% 25 boş fiziksel bellek,> = 8 MB ve <= 64 MB
      • -client mode:% 25 boş fiziksel bellek,> = 8 MB ve <= 16 MB
    • Typical Size:
      • -Xms128M
      • -Xms256M
      • -Xms512M
    • Function/Effect:
      • -> JVM başlangıç Xmsboyutu bellek ile başlar
  • Xmx: maximumJVMheap size
    • Format: -Xmx<size>[g|G|m|M|k|K]
    • Default Size:
      • <= R27.2
        • Windows: 75%toplam fiziksel belleğe kadar1GB
        • Linux/Solaris: 50%kullanılabilir fiziksel belleğe kadar1GB
      • >= R27.3
        • Windows X64: 75%toplam fiziksel belleğe kadar2GB
        • Linux/Solaris X64: 50%kullanılabilir fiziksel belleğe kadar2GB
        • Windows x86: 75%toplam fiziksel belleğe kadar1GB
        • Linux/Solaris X86: 50%kullanılabilir fiziksel belleğe kadar1GB
    • Typical Size:
      • -Xmx1g
      • -Xmx2084M
      • -Xmx4g
      • -Xmx6g
      • -Xmx8g
    • Function/ Effect:
      • -> JVM maksimum Xmxboyutta bellek kullanımına izin verir
        • aştığında Xmx, olacakjava.lang.OutOfMemoryError
          • Nasıl düzeltilir OutOfMemoryError?
            • Xmxdeğeri aş
              • örneğin: -Xmx4gila-Xmx8g

Daha fazla detay

resmi dokümana bakınız: -X Komut Satırı Seçenekleri


JRockit JVM için değil mi? (Oracle'ın Hotspot
JVM'sinin

4

Bazı parametreler üretim boyutunu etkiler. Aşağıdaki şema, ayrılmış alan ile yığındaki sanal alan arasındaki farkı göstermektedir. Sanal makinenin başlatılması sırasında, yığın için tüm alan ayrılmıştır. Ayrılan alanın boyutu -Xmxseçenekle belirtilebilir . -XmsParametrenin değeri parametrenin değerinden küçükse -Xmx, ayrılan alanın tamamı hemen sanal makineye ayrılmaz. Taahhütsüz alan bu şekilde "sanal" olarak etiketlenmiştir. Yığının farklı kısımları (kalıcı nesil, dayanıklı nesil ve genç nesil) sanal alanın sınırına kadar büyüyebilir.

resim açıklamasını buraya girin

Varsayılan olarak, sanal makine belirli bir aralıktaki her koleksiyondaki canlı nesneler için boş alan oranını korumaya çalışmak amacıyla her koleksiyondaki yığını büyütür veya daraltır. Bu hedef aralık, parametreler tarafından yüzde olarak ayarlanır - XX:MinHeapFreeRatio=<minimum>ve -XX:MaxHeapFreeRatio=<maximum>toplam boyut, aşağıda -Xms<min>ve tarafından sınırlanır -Xmx<max>.

Parametre Varsayılan Değeri

MinHeapFreeRatio 40

MaxHeapFreeRatio 70

-Xms 3670k

-Xmx 64m

64 bit sistemlerde yığın boyutu parametrelerinin varsayılan değerleri yaklaşık% 30 oranında artırılmıştır. Bu artış, 64 bit sistemdeki daha büyük nesnelerin boyutunu telafi etmek içindir.

Bu parametrelerle, bir nesnedeki boş alan yüzdesi% 40'ın altına düşerse, üretim, neslin izin verilen maksimum boyutuna kadar% 40 boş alanı korumak için genişletilecektir. Benzer şekilde, boş alan% 70'i aşarsa, jenerasyon sözleşmeye tabi tutulacak ve böylece alanın minimum% 70'ine bağlı olarak alanın sadece% 70'i serbest olacaktır.

Büyük sunucu uygulamaları genellikle bu varsayılanlarla iki sorun yaşar. Birincisi yavaş başlangıçtır, çünkü ilk yığın küçüktür ve birçok büyük koleksiyonda yeniden boyutlandırılması gerekir. Daha acil bir sorun, varsayılan maksimum yığın boyutunun çoğu sunucu uygulaması için makul olmayan şekilde küçük olmasıdır. Sunucu uygulamaları için temel kurallar:

  • Duraklatma sorunlarınız olmadığı sürece, sanal makineye mümkün olduğunca fazla bellek vermeyi deneyin. Varsayılan boyut (64 MB) genellikle çok küçüktür.
  • -Xms ve -Xmx değerlerinin aynı değere ayarlanması, sanal makineden en önemli boyutlandırma kararını kaldırarak öngörülebilirliği artırır. Ancak, kötü bir seçim yaparsanız sanal makine telafi edemez.
  • Genel olarak, ayırma paralel hale getirilebildiğinden, işlemci sayısını artırdıkça belleği artırın.

    Orada tam makale

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.