Java necə işləyir

Mövzu seç, kod yaz və daxildə nə baş verdiyini addım-addım gör.

Memory

Collection-lar

Concurrency

Dil və JVM

Mövzular

Garbage Collection

Object nə vaxt silinir?

GC object-in lazım olub-olmadığını bilmir. Yalnız bir suala cavab axtarır: GC root-lardan bu object-ə reference yolu ilə çatmaq olurmu?

GC root-lar: stack-dəki local variable-lar, static field-lər və işləyən thread-lər. Çatılan object reachable-dır və qalır.

Sağda addımla: reference-lər kəsildikcə object-in vəziyyəti dəyişir.

Cycle və mark-sweep

Bir-birinə baxan iki object silinə bilərmi? Reference counting olsaydı, silinməzdi. Java reference saymır, root-lardan başlayır, ona görə cycle problem deyil.

Mark: GC root-lardan gəzib çatdığı object-ləri işarələyir. Sweep: işarəsiz object-lərin yerini boşaldır. Compact mərhələsi isə qalanları sıxlaşdırır.

Mərhələlərin bir hissəsi işləyərkən application dayana bilər. Buna stop-the-world pause deyilir.

Eden, Survivor və Old

Çox object tez ölür, ona görə heap nəsillərə bölünür. Yeni object Eden-də yaranır. Eden dolanda Minor GC işləyir.

Minor GC yalnız sağ qalanları köçürür: Survivor-a keçir, age 1 artır. Eyni vaxtda bir Survivor həmişə boşdur. age limitə çatanda object Old-a keçir.

Old daha nadir yoxlanır. Yoxla: new bas, object-lərə klik edib reference-ini sil, sonra Minor GC bas. Old-da ölü object Minor GC ilə silinmir, onun üçün Full GC lazımdır.

Memory leak Java-da necə olur?

GC var, amma leak yenə olur: lazım olmayan object-ə reference qalıbsa, GC onu silə bilməz. GC üçün o, hələ reachable-dır.

Ən çox görülən hal static collection-dır, sonra bağlanmayan listener-lər və limitsiz cache-lər. Heap dolanda OutOfMemoryError gəlir.

Həll reference-i silməkdir: remove, clear, limitli cache və ya WeakReference.

Collector seçimi

Hamısı reachable object-ləri tapır, fərq nə vaxt və necə işləməsindədir. Pause qısa olsun, yoxsa ümumi iş çox olsun? Adətən ikisi birdən ən yaxşı olmur.

Çox vaxt default-u dəyişmək lazım deyil. Əvvəl -Xlog:gc ilə ölç, sonra qərar ver.

Tələ: finalize() deprecated-dir, resurs bağlamaq üçün try-with-resources işlət.