G1'de Java 7 (JDK 7) çöp toplama ve dokümantasyon


82

Java 7 bir süredir kullanıma sunuldu, ancak çöp toplayıcılarının , özellikle de yeni G1 toplayıcısının yapılandırması hakkında iyi bir kaynak bulamıyorum .

Sorularım:

  1. G1, Java 7'de varsayılan toplayıcı mıdır ve değilse G1'i nasıl etkinleştiririm?
  2. Java7'de g1 hangi isteğe bağlı ayarlar içerir?
  3. Java 7'deki cms veya paralel toplayıcı gibi diğer toplayıcılarda herhangi bir değişiklik yapıldı mı?
  4. Java 7'de çöp toplamayla ilgili iyi belgeleri nerede bulabilirim?

6
G1 Çöp Toplayıcısına Başlarken ayrıca en iyi uygulamalarla iyi bir genel bakış sağlar.
John McCarthy

Yanıtlar:


47

G1 çöp toplayıcı, Java yüklememin 1.7.0_01 sürümünde varsayılan değil. Bazı ekstra komut satırı seçeneklerini kullanarak kendiniz görebilirsiniz:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 PSYoungGen      total 37696K, used 1293K [0x00000007d5eb0000, 0x00000007d88c0000, 0x0000000800000000)
  eden space 32320K, 4% used [0x00000007d5eb0000,0x00000007d5ff3408,0x00000007d7e40000)
  from space 5376K, 0% used [0x00000007d8380000,0x00000007d8380000,0x00000007d88c0000)
  to   space 5376K, 0% used [0x00000007d7e40000,0x00000007d7e40000,0x00000007d8380000)
 PSOldGen        total 86144K, used 0K [0x0000000781c00000, 0x0000000787020000, 0x00000007d5eb0000)
  object space 86144K, 0% used [0x0000000781c00000,0x0000000781c00000,0x0000000787020000)
 PSPermGen       total 21248K, used 2032K [0x000000077ca00000, 0x000000077dec0000, 0x0000000781c00000)
  object space 21248K, 9% used [0x000000077ca00000,0x000000077cbfc288,0x000000077dec0000)

G1 toplayıcıyı artık açmak için deneysel seçenekleri etkinleştirmenize gerek yok, ancak:

> java -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseG1GC -version
-XX:InitialHeapSize=132304640 -XX:MaxHeapSize=2116874240 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:+UseG1GC -XX:-UseLargePagesIndividualAllocation
java version "1.7.0_01"
Java(TM) SE Runtime Environment (build 1.7.0_01-b08)
Java HotSpot(TM) 64-Bit Server VM (build 21.1-b02, mixed mode)
Heap
 garbage-first heap   total 130048K, used 0K [0x000000077ca00000, 0x0000000784900000, 0x00000007fae00000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 compacting perm gen  total 20480K, used 2032K [0x00000007fae00000, 0x00000007fc200000, 0x0000000800000000)
   the space 20480K,   9% used [0x00000007fae00000, 0x00000007faffc288, 0x00000007faffc400, 0x00000007fc200000)
No shared spaces configured.

İyi belgeleri nerede bulabileceğinizi bilmiyorum.


2
Bu, OSX'te 1.7.0_09 için hala geçerli
Age Mooij

Doğrudan Oracle web sitesinden getirilen linux / amd64 üzerindeki Oracle JDK 7u17 için doğru değildir. Diyor -XX:+UseParallelGC.
user1050755

31

Oracle sonunda Java 7 U4'te G1'i resmi yaptı: http://www.oracle.com/technetwork/java/javase/7u4-relnotes-1575007.html

Açıklama: http://docs.oracle.com/javase/7/docs/technotes/guides/vm/G1.html

Komut satırı seçenekleri: http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html#G1Options

Yine de, Java 7'de varsayılan toplayıcı olduğunu düşünmüyorum. Sunucular için varsayılan, Java 6'daki gibi Paralel Toplayıcı'dır.


1
ve sunucu 2 çekirdek ve 2 GB ram veya daha fazlası ile tanımlanır. Ayrıntılar hg.openjdk.java.net/jdk7u/jdk7u/hotspot/file/0d82bf449a61/src adresinde bulunabilir - dosyalara bakın ./share/tools/launcher/java.c ve ./share/vm/runtime/ os.cpp
user1050755

22

Evet, G1, Java 1.7 JVM'deki yeni standart çöp toplayıcıdır.

Burada yeni çöp toplayıcının nasıl kullanılacağı ve yapılandırılacağı hakkında pek çok bilgi bulabilirsiniz:

G1 G1 kullanımı hala deneysel olarak kabul edilmektedir ve aşağıdaki iki parametre ile etkinleştirilebilir:

-XX: + UnlockExperimentalVMOptions -XX: + UseG1GC

Bir GC duraklatma süresi hedefi ayarlamak için aşağıdaki parametreyi kullanın:

-XX: MaxGCPauseMillis = 50 (50 ms'lik bir duraklama süresi hedefi için)

G1 ile, bir GC duraklamasının yukarıda verilen süreden daha uzun sürmemesi gereken bir zaman aralığı belirlenebilir:

-XX: GCPauseIntervalMillis = 200 (200 ms'lik bir duraklama aralığı hedefi için)

Yukarıdaki iki seçeneğin vaatleri veya garantileri değil hedefleri temsil ettiğini unutmayın. Bazı durumlarda işe yarayabilir ancak bazılarında işe yaramayabilirler ve GC bunlara her zaman itaat edemeyebilir.

Alternatif olarak, tahliye duraklatma sürelerini etkilemek için genç neslin boyutu açıkça belirtilebilir:

-XX: + G1YoungGenSize = 512m (512 megabayt genç nesil için)

G1 ayrıca doğal olarak bir dizi (potansiyel olarak bitişik olmayan) bölge olan hayatta kalan alanların eşdeğerini kullanır. Boyutları olağan parametrelerle belirtilebilir (örneğin, -XX: SurvivorRatio = 6).

Son olarak, G1'i tam potansiyelinde çalıştırmak için, şu anda varsayılan olarak devre dışı olan bu iki parametreyi ayarlamayı deneyin çünkü bunlar nadir bir yarış durumunu ortaya çıkarabilirler:

-XX: + G1ParallelRSetUpdatingEnabled -XX: + G1ParallelRSetScanningEnabled

Unutulmaması gereken bir şey daha, -XX: + PrintGCDetails ayarlandığında G1'in diğer HotSpot GC'lerine kıyasla çok ayrıntılı olmasıdır. Bunun nedeni, profil oluşturma ve sorun gidermede çok yardımcı olan GC iş parçacığı başına zamanlamaları ve diğer bilgileri yazdırmasıdır. Daha kısa bir GC günlüğü istiyorsanız, lütfen -verbosegc komutuna geçin (daha ayrıntılı GC günlüğünün elde edilmesi önerilir).

Ayrıca bu makaleyi G1'in içini anlamada çok yararlı buldum .

Burada daha fazla bilgi .


6
Bu kaynakları gördüm. Ancak ilk makale, hala deneysel bir seçenek iken JDK 6'daki G1 hakkındadır. Diğer makaleler JDK 7'nin beta sürümleri hakkındadır ve en az 1 yaşında. Oracle veya JDK ekibinden daha güncel bilgiler veya resmi belgeler arıyorum.
Florakel

13

1. Java 7'de G1 varsayılan toplayıcı mı (...)

Bu Java 5 sayfasındaki kural Java 7'de (ve AFAIK, Java 8'de) hala geçerlidir:

Açık sunucu sınıfı paralel bir toplayıcıya (XX: + UseParallelGC): Sunucu VM çalışan makineler, çöp toplayıcı (GC) önceki seri toplayıcı (+ UseSerialGC XX) değişti.

Ancak şunu da göz önünde bulundurun:

  • 64 bit JVM'ler bir -clientVM ile birlikte gelmez , bu nedenle her zaman "sunucu sınıfı" dır
  • Java 7'den beri, -XX: + UseParallelGC (ayarlanmış olsun ya da olmasın) kullanılması ek olarak -XX: + UseParallelOldGC (yani açıkça devre dışı bırakılmadıkça) anlamına gelir

Örneğin, Windows x64'te çalıştırıyorsanız ...

  • Java 7 64-bit, varsayılan olarak Parallel GC'yi (hem genç hem de eski nesiller için) alırsınız.
  • Java 8 32-bit, varsayılan olarak Seri GC (her iki nesil için) alırsınız

1. (...) G1'i nasıl etkinleştiririm?

Java 7'den itibaren, basitçe -XX:+UseG1GC. Belki de ilgilendiğiniz zaman :

Bugün CMS veya ParallelOld çöp toplayıcı ile çalışan uygulamalar, aşağıdaki özelliklerden bir veya daha fazlasına sahipse, G1'e geçişten fayda sağlayacaktır.

  • Java yığınının% 50'sinden fazlası canlı verilerle meşgul.
  • Nesne tahsis oranı veya terfi oranı önemli ölçüde değişir.
  • İstenmeyen uzun çöp toplama veya sıkıştırma duraklamaları (0,5 ila 1 saniyeden uzun)

2. Java7'de g1 hangi isteğe bağlı ayarlara sahiptir?

Ben G1 aralık kendim kullanılmaz, ama ben toplamak aynı temel uyduğunu "performans / ergonomik" Diğer paralel toplayıcılar ayarlamak için kullanılan bayraklar. Parallel GC ile olan deneyimime göre -XX:GCTimeRatio, beklenen hız-bellek değişimini sağlamada çok önemli bir rol oynadı. YMMV.

G1'e özgü seçenekler burada listelenmiştir

3. Java 7'de (...) cms veya paralel toplayıcıda değişiklikler oldu mu?

Bilmiyorum ama ...

G1, Concurrent Mark-Sweep Collector (CMS) için uzun vadeli ikame olarak planlanmıştır.

4. Java 7'de çöp toplamayla ilgili iyi belgeleri nerede bulabilirim?

Bulmak acı olabilir, değil mi? Muhtemelen bulduğum en iyi "merkez" sayfası şudur:

http://www.oracle.com/technetwork/java/javase/tech/index-jsp-140228.html

Biraz derin okuma gerekli, ancak biraz ayar yapmanız gerekiyorsa zaman ayırmaya değer. Özellikle anlayışlı olan: Çöp Toplayıcı Ergonomisi


13
  1. G1, Java 7'de varsayılan toplayıcı mıdır ve değilse G1'i nasıl etkinleştiririm?

G1, Java 7'de varsayılan toplayıcı değildir. -XX:+UseG1GCG1GC'yi etkinleştirir

  1. Java7'de g1 hangi isteğe bağlı ayarlar içerir?

Çok var. Tam bilgi için bu oracle makalesine bir göz atın .

G1 GC, değişiklik yapmadan verimli bir şekilde çalışmasını sağlayan varsayılanlara sahip uyarlanabilir bir çöp toplayıcıdır.

Bu nedenle, kritik parametreleri özelleştirin

-XX:MaxGCPauseMillis
-XX:G1HeapRegionSize
-XX:ParallelGCThreads
-XX:ConcGCThreads

ve diğer tüm parametreleri varsayılan değere bırakın .

Burada önemli seçeneklerin bir listesi ve varsayılan değerleri bulunmaktadır. Bu liste en son Java HotSpot VM, build 24 için geçerlidir. G1 GC ayarlarını JVM komut satırında uyarlayabilir ve ayarlayabilirsiniz.

Önemli Varsayılanlar:

-XX:G1HeapRegionSize=n

Bir G1 bölgesinin boyutunu ayarlar. Değer ikinin gücü olacaktır ve 1MB ile 32MB arasında değişebilir. Hedef, minimum Java yığın boyutuna dayalı olarak yaklaşık 2048 bölgeye sahip olmaktır.

-XX:MaxGCPauseMillis=200

İstenen maksimum duraklama süresi için bir hedef değer ayarlar. Varsayılan değer 200 milisaniyedir. Belirtilen değer, yığın boyutunuza uymuyor.

-XX:G1NewSizePercent=5

Genç nesil boyutu için minimum olarak kullanılacak yığın yüzdesini ayarlar. Varsayılan değer, Java yığınınızın yüzde 5'idir.

-XX:G1MaxNewSizePercent=60

Genç nesil boyutu için maksimum olarak kullanılacak yığın boyutunun yüzdesini ayarlar. Varsayılan değer, Java yığınınızın yüzde 60'ıdır.

-XX:ParallelGCThreads=n

STW çalışan iş parçacığının değerini ayarlar. N'nin değerini mantıksal işlemci sayısına ayarlar. N'nin değeri, 8 değerine kadar mantıksal işlemci sayısıyla aynıdır.

Sekizden fazla mantıksal işlemci varsa, n değerini mantıksal işlemcilerin yaklaşık 5 / 8'ine ayarlar. Bu, n'nin değerinin mantıksal işlemcilerin yaklaşık 5 / 16'sı olabileceği daha büyük SPARC sistemleri dışında çoğu durumda işe yarar.

-XX:ConcGCThreads=n

Paralel işaretleme ipliklerinin sayısını ayarlar. Paralel atık toplama iş parçacığı (ParallelGCThreads) sayısının yaklaşık 1 / 4'üne n ayarlar.

-XX:InitiatingHeapOccupancyPercent=45

Bir işaretleme döngüsünü tetikleyen Java yığın doluluk eşiğini ayarlar. Varsayılan doluluk, tüm Java yığınının yüzde 45'idir.

-XX:G1MixedGCLiveThresholdPercent=65

Karışık bir çöp toplama döngüsüne dahil edilecek eski bir bölge için doluluk eşiğini ayarlar. Varsayılan doluluk yüzde 65'tir

-XX:G1HeapWastePercent=10

Harcamak istediğiniz yığın yüzdesini ayarlar. Java HotSpot VM, geri alınabilir yüzdesi yığın atık yüzdesinden daha az olduğunda karışık çöp toplama döngüsünü başlatmaz

-XX:G1MixedGCCountTarget=8

En fazla G1MixedGCLIveThresholdPercent canlı veriye sahip eski bölgeleri toplamak için bir işaretleme döngüsünden sonra hedef karışık çöp toplama sayısını ayarlar. Varsayılan, 8 karışık çöp koleksiyonudur

-XX:G1OldCSetRegionThresholdPercent=10

Karışık çöp toplama döngüsü sırasında toplanacak eski bölgelerin sayısı için bir üst sınır belirler. Varsayılan, Java yığınının yüzde 10'udur

-XX:G1ReservePercent=10

Alana taşma riskini azaltmak için boşta tutulacak yedek bellek yüzdesini ayarlar. Varsayılan yüzde 10'dur. Yüzdeyi artırdığınızda veya azalttığınızda, toplam Java yığınını aynı miktarda ayarladığınızdan emin olun.

Yukarıdaki dokümantasyon sayfasını izlerseniz gerekli olmayan birçok G1GC parametresini yeniden yapılandırdınız. Lütfen, özellikle CPU çekirdeklerinize dayalı olan ParallelGCThreads ve ConcGCThreads üzerine yukarıdaki önerileri kontrol edin . Gereksiz parametrelerin yeniden yapılandırmasını kaldırın.

Öneriler oracle:

G1 GC'yi değerlendirip ince ayar yaparken aşağıdaki önerileri aklınızda bulundurun:

  1. Genç Nesil Boyutu : Bu -Xmnseçenekle veya herhangi bir veya başka bir ilgili seçenekle , genç nesil boyutunu açıkça belirlemekten kaçının -XX:NewRatio. Genç neslin boyutunu sabitlemek, hedef duraklama süresi hedefini geçersiz kılar .

  2. Zaman Hedeflerini Duraklatma: Herhangi bir çöp toplamayı değerlendirdiğinizde veya ayarladığınızda, her zaman bir gecikme ile aktarım hızı arasında bir değişim vardır. G1 GC, tek tip duraklamalara sahip artımlı bir çöp toplayıcıdır, ancak uygulama iş parçacıklarında daha fazla ek yüke sahiptir. G1 GC için aktarım hızı hedefi, yüzde 90 uygulama süresi ve yüzde 10 çöp toplama süresidir .

  1. Java 7'deki cms veya paralel toplayıcı gibi diğer toplayıcılarda herhangi bir değişiklik yapıldı mı?

Java 7'de bazı değişiklikler var. Bu makaleye bir göz atın

  1. Java 7'de çöp toplamayla ilgili iyi belgeleri nerede bulabilirim?

Gc ve ilgili SE sorusu hakkında oracle belgeleri sayfasına bakın :

Üretimde Java G1 çöp toplama


3

Hiçbir G1, jdk 1.7.0_02'de varsayılan çöp toplayıcı değildir. Varsayılan çöp toplayıcı, makinenin sınıfına bağlıdır. Makine Sunucu sınıfındaysa, varsayılan çöp toplayıcı Aktarım Toplayıcı'dır. Makine Client sınıfındaysa, varsayılan çöp toplayıcı Seri Toplayıcı'dır.


1
Bunun tamamen doğru olduğuna itiraz ediyorum . Java 5 referansı , hala geçerli. Windows sisteminde (32/64): Java 32-bit (5..8) >> Serial GC'yi varsayılan olarak çalıştırın. Java 64-bit (5..6) >> ParallelGC'yi (yalnızca Young gen) varsayılan olarak çalıştırın. Java 64-bit (7..8) >> ParallelOldGC'yi (paralel Young ve Eski) varsayılan olarak çalıştırın. Java 7 değişikliği için referans , son olarak 'paralel' toplayıcı == 'verim' toplayıcı "
Luke Usherwood

3
(Bu kişinin ilk ve doğru, SO katkısı için sert bir yanıt. Aynı zamanda onların da son olduğunu not ediyorum.)
Luke Usherwood


0

Varsayılan olarak, diğerlerinden daha iyi olmadığı için G1 toplayıcıyı gerçekten kullanmak istemezsiniz. Sadece özel amaçlar için iyidir.

Düşük gecikmeli uygulamada uygulama, biraz daha kısa ve daha öngörülebilir duraklama sürelerine sahip olduğu için CMS'den biraz daha iyidir. Buna karşılık, işlem hacmi, karşılığında CMS'den çok daha kötü.

Bu nedenle, yalnızca gecikme önemliyse iyidir, ancak iş hacmi hiç de önemli değildir. Her ikisi de önemliyse, CMS ile kalın.

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.