Java'da Garbage Collection nasıl çalışır? G1 ve ZGC arasındaki farklar nelerdir, hangisini ne zaman seçersiniz?

Cevap

GC, GC root'lardan (thread stack'leri, statik alanlar, JNI referansları) ulaşılamayan nesneleri bulup belleği geri kazanır. Çoğu collector generational hipoteze dayanır: nesnelerin çoğu kısa ömürlüdür, bu yüzden young generation sık ve ucuz, old generation seyrek temizlenir.

Temel aşamalar

  1. Mark: root'lardan erişilebilen nesneler işaretlenir.
  2. Sweep / Compact: işaretsizler silinir; parçalanmayı önlemek için canlı nesneler taşınır.
  3. Young GC'de Eden'de hayatta kalanlar Survivor'a, birkaç döngü yaşayanlar old generation'a terfi eder (promotion).

Stop-the-world (STW) pause'lar uygulama thread'lerini durdurur; modern collector'ların amacı bu süreyi kısaltmaktır.

Collector karşılaştırması

CollectorÖzellikUygun senaryo
SerialTek thread, basitKüçük heap, tek CPU, CLI araçları
ParallelThroughput odaklı, STWBatch işler, gecikme önemsiz
G1 (Java 9+ varsayılan)Heap'i region'lara böler, hedef pause süresi (MaxGCPauseMillis, varsayılan 200ms)Çoğu web servisi, 4-32 GB heap
ZGCNeredeyse tüm işi concurrent yapar, pause genelde 1ms altında, TB'larca heapDüşük gecikme kritik API'ler, büyük heap
ShenandoahZGC'ye benzer concurrent compactionDüşük gecikme (Red Hat dağıtımları)

Java 21'de Generational ZGC geldi (-XX:+UseZGC -XX:+ZGenerational), Java 23'te varsayılan ZGC modu oldu. Bu, ZGC'nin throughput dezavantajını büyük ölçüde azalttı.

Pratikte nasıl karar verilir?

  • Önce varsayılan G1 ile başlayın, GC loglarını açın: -Xlog:gc*:file=gc.log.
  • p99 gecikmede GC pause'ları görüyorsanız ve heap büyükse ZGC'yi deneyin.
  • GC sorunlarının çoğu collector değil allocation sorunudur: gereksiz nesne üretimi, büyük cache'ler. Önce profiling yapın (JFR, async-profiler).
  1. Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?OrtaJava & SpringBackend
  2. ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?OrtaJava & SpringBackend
  3. JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?OrtaJava & SpringBackend
  4. @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.ZorJava & SpringBackend
  5. Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?KolayJava & SpringBackend
  6. Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?KolayJava & SpringBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle