Java nasıl çalışır

Konu seç, kod yaz ve içeride ne olduğunu adım adım gör.

Memory

Collection'lar

Concurrency

Dil ve JVM

Konular

Garbage Collection

Object ne zaman silinir?

GC bir object'in gerekli olup olmadığını bilmez. Tek bir soruya bakar: GC root'lardan bu object'e reference yoluyla ulaşılıyor mu?

GC root'lar: stack'teki local variable'lar, static field'lar ve çalışan thread'ler. Ulaşılan object reachable olur ve kalır.

Sağda adım adım ilerle: reference'lar kesildikçe object'in durumu değişir.

Cycle ve mark-sweep

Birbirine bakan iki object silinebilir mi? Reference counting olsaydı silinmezdi. Java reference saymaz, root'lardan başlar, bu yüzden cycle sorun değildir.

Mark: GC root'lardan gezip ulaştığı object'leri işaretler. Sweep: işaretsiz object'lerin yerini boşaltır. Compact aşaması da kalanları sıkıştırır.

Bazı aşamalarda application durabilir. Buna stop-the-world pause denir.

Eden, Survivor ve Old

Çoğu object çabuk ölür, bu yüzden heap nesillere bölünür. Yeni object Eden'de oluşur. Eden dolunca Minor GC çalışır.

Minor GC yalnızca hayatta kalanları taşır: Survivor'a geçer, age 1 artar. Aynı anda bir Survivor her zaman boştur. age sınıra gelince object Old'a geçer.

Old daha seyrek kontrol edilir. Dene: new bas, object'lere tıklayıp reference'ını sil, sonra Minor GC bas. Old'daki ölü object Minor GC ile silinmez, Full GC gerekir.

Java'da memory leak nasıl olur?

GC var ama leak yine olur: gereksiz bir object'e reference kaldıysa GC onu silemez. GC için hâlâ reachable'dır.

En sık görülen hal static collection'dır, sonra kapatılmayan listener'lar ve sınırsız cache'ler. Heap dolunca OutOfMemoryError gelir.

Çözüm reference'ı silmektir: remove, clear, sınırlı cache veya WeakReference.

Collector seçimi

Hepsi reachable object'leri bulur, fark ne zaman ve nasıl çalıştıklarındadır. Pause mu kısa olsun, toplam iş mi çok olsun? Genellikle ikisi birden en iyi olmaz.

Çoğu zaman default'u değiştirmek gerekmez. Önce -Xlog:gc ile ölç, sonra karar ver.

Tuzak: finalize() deprecated'dır, kaynak kapatmak için try-with-resources kullan.