seri GC

Çöp toplama, başvurulmayan nesneleri yığından kaldırarak ve yeni oluşturulan nesneler için yer açarak Java'da bellek verimliliğini artırır.

Java sanal makinesinde sekiz tür çöp toplayıcı vardır. Her birini ayrıntılı olarak ele alalım.

Seri GC, en basit GC uygulamasıdır. Tek iş parçacıklı ortamlarda çalışan küçük uygulamalar için tasarlanmıştır. Tüm çöp toplama olayları, aynı iş parçacığında sırayla yürütülür. Sıkıştırma, her çöp toplama işleminden sonra gerçekleştirilir.

seri GC

Toplayıcının çalıştırılması, tüm uygulamanın askıya alındığı bir "dünyayı durdurma" olayıyla sonuçlanır. Çöp toplama sırasında tüm uygulama donduğu için, gecikmeleri olabildiğince düşük tutmak istiyorsanız gerçek hayatta buna başvurmamalısınız.

Seri çöp toplayıcıyı kullanmak için JVM bağımsız değişkeni -XX:+UseSerialGC şeklindedir .

paralel GC

Paralel çöp toplayıcı, çok iş parçacıklı veya çok işlemcili donanım üzerinde çalışan orta ila büyük veri kümelerine sahip uygulamalar için tasarlanmıştır. Bu, varsayılan GC uygulamasıdır ve aktarım hızı toplayıcısı olarak da bilinir.

Genç nesilde küçük çöp toplama için birkaç iş parçacığı ayrılmıştır. Tek iş parçacığı, eski nesildeki ana çöp toplama ile meşgul.

paralel GC

Paralel bir GC çalıştırmak ayrıca dünyanın "durmasına" ve uygulamanın askıda kalmasına neden olur. Bu davranış, bir toplu işi çalıştırırken olduğu gibi, birçok görevin tamamlanması gereken ve uzun duraklamaların kabul edilebilir olduğu çok iş parçacıklı bir ortam için daha uygundur.

Paralel çöp toplayıcıyı kullanmak için JVM bağımsız değişkeni -XX:+UseParallelGC şeklindedir .

İYS GC

Bizim tarafımızdan düşük dinlenmeli paralel toplayıcı olarak da bilinir .

Burada, küçük bir çöp toplama için, birkaç iş parçacığı söz konusudur, bu, paralel toplayıcıdaki ile aynı algoritma aracılığıyla gerçekleşir. Ana çöp toplama, tıpkı eski paralel GC gibi çok iş parçacıklıdır, ancak CMS, "dünyayı durdurma" olaylarını en aza indirmek için uygulama süreçleriyle eşzamanlı olarak çalışır.

İYS GC

Bu nedenle, CMS toplayıcı diğer toplayıcılardan daha fazla CPU tüketir. Performansı artırmak için daha fazla CPU ayırma yeteneğiniz varsa, basit bir paralel toplayıcı yerine bir CMS tercih edilir. CMS GC kompakt değildir.

Paralel işaretleme süpürme çöp toplayıcısını kullanmak için JVM bağımsız değişkeni -XX:+UseConcMarkSweepGC şeklindedir .

G1 (Önce çöp) GC

G1GC, CMS'nin yerine geçecek şekilde tasarlandı ve büyük yığın boyutlarıyla (4 GB'tan büyük) karakterize edilen çok iş parçacıklı uygulamalar için geliştirildi. Bir CMS gibi paralel ve rekabetçidir, ancak kaputun altında eski çöp toplayıcılardan çok farklı çalışır.

G1 aynı zamanda kuşak bazında faaliyet gösterse de, genç ve yaşlı kuşaklar için ayrı alanlara sahip değildir. Bunun yerine, her nesil, genç neslin boyutunu değiştirmede esneklik sağlayan bir dizi bölgedir.

G1, yığını eşit boyutlu bölgelere ayırır (yığın boyutuna bağlı olarak) ve bunları birden çok iş parçacığına tarar. Programın yürütülmesi sırasında alan tekrar tekrar hem yaşlı hem de genç olabilir.

İşaretleme aşaması tamamlandıktan sonra, G1 hangi alanların en çok çöp içerdiğini bilir. Kullanıcı duraklamaları en aza indirmekle ilgileniyorsa, G1 yalnızca birkaç alan seçebilir. Duraklama süresi kullanıcı için önemli değilse veya duraklama süresi limiti yüksek olarak ayarlanmışsa, G1 daha fazla alan üzerinden geçecektir.

G1 GC, çöpün en çok olduğu bölgeleri belirleyip ilk olarak bu bölgelerde çöp toplama işlemi yaptığı için "Garbage First" olarak adlandırılır.

Eden, Survivors ve Old Memory alanlarına ek olarak, G1GC'de iki tür daha vardır.

  • Humongous (Huge) - büyük boyutlu nesneler için (yığın boyutunun %50'sinden fazlası).
  • Kullanılabilir - Kullanılmayan veya ayrılmamış alan.

G1 çöp toplayıcısını kullanmak için JVM bağımsız değişkeni -XX:+UseG1GC şeklindedir .

Shenandoah (Shandara)

Shenandoah , JDK 12'nin bir parçası olarak yayınlanan yeni bir GC'dir. Shenandoah'ın G1'e göre en önemli avantajı, çöp toplama döngüsünün çoğunun uygulama dizileriyle eşzamanlı olarak yapılmasıdır. G1, yalnızca uygulama askıya alındığında yığın alanlarını boşaltabilirken, Shenandoah nesneleri uygulama ile aynı anda taşır.

Shenandoah, canlı nesneleri sıkıştırabilir, çöpleri temizleyebilir ve neredeyse boş bellek bulunur bulunmaz RAM'de yer açabilir. Tüm bunlar, uygulamayı askıya almadan aynı anda gerçekleştiğinden, Shenandoah daha fazla CPU kullanır.

Shenandoah çöp toplayıcı için JVM bağımsız değişkeni: -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC .

ZGC

ZGC , JDK 11'in bir parçası olarak yayınlanan ve JDK 12'de geliştirilmiş başka bir GC'dir.

Hız ve düşük gecikme süresi (10 ms'den az duraklamalar) gerektiren ve/veya çok büyük bir yığın (birkaç terabayt) kullanan uygulamalar için tasarlanmıştır.

ZGC'nin ana hedefleri düşük gecikme süresi, ölçeklenebilirlik ve kullanım kolaylığıdır. Bunu yapmak için, çöp toplama işlemleri devam ediyor olmasına rağmen Java uygulamasının çalışmaya devam etmesine izin verir. Varsayılan olarak, ZGC kullanılmayan belleği serbest bırakır ve işletim sistemine geri döndürür.

Böylece, ZGC son derece düşük ölü zamanlar (tipik olarak 2ms içinde) sağlayarak diğer geleneksel GC'lere göre önemli bir gelişme sağlar.

ZGC'nin ana hedefleri 

ZGC çöp toplayıcısını kullanmak için JVM bağımsız değişkeni -XX:+UnlockExperimentalVMOptions -XX:+UseZGC şeklindedir .