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

Object bellekte

Header: her object'in 12 byte'ı

Heap'teki her object bir header ile başlar. 8 byte mark word, 4 byte ise class pointer'dır, yani object'in class'ı.

Mark word birkaç iş görür: identity hash, GC age ve kilit durumu. Hepsi aynı 64 bit'te durur. Kilit alınınca bu bit'ler bir pointer'a dönüşür.

Düğmelere bas ve bit'lerin nasıl değiştiğine bak. Java 18'den beri biased locking yok, bu yüzden burada da gösterilmiyor.

Field’lar ve padding

Field'lar yazıldıkları sırayla dizilmez. JVM önce büyük primitive'leri, sonra küçükleri, en sonda reference'ları yerleştirir. Her field için ona sığan en küçük boşluğu seçer.

Her field kendi boyutuna bölünen bir offset'te başlar: long 8'e, int 4'e bölünen yerde. Object'in boyutu ise 8'e bölünmeli.

Kendi class'ını kur ve byte'ların nasıl yerleştiğine bak. Header'dan sonraki 4 byte'ı çoğu zaman bir int veya reference doldurur.

Array’ler

Array'in header'ı 16 byte'tır: mark word, class pointer ve 4 byte length. Element'ler onun ardından gelir.

Primitive array değerleri kendisinde tutar. Integer[] ise sadece reference tutar, her Integer heap'te ayrı 16 byte'lık bir object'tir.

Bu yüzden 100 sayı için int[] 416 byte, Integer[] ise 2016 byte tutar.

Collection'ların bedeli

Collection'lar primitive tutamaz, her sayı bir Integer olur. Ayrıca her element için iç object'ler oluşur: HashMap'te Node, LinkedList'te çift bağlı Node.

1000 sayı int[]'de 4 KB, HashSet<Integer>'da ise 56 KB tutar, yani 14 kat fazla. Milyonlarca element olunca bu fark önemlidir.

Primitive'ler için özel collection'lar var, örneğin Eclipse Collections ve fastutil kütüphanelerinde. Onlar int[] gibi az yer tutar.

32 GB sınırı

64-bit JVM'de pointer 8 byte'tır, ama heap küçükse JVM onu 4 byte'a sıkıştırır: compressed oops.

4 byte'a 2³² farklı değer sığar. JVM bunu 8 ile çarpar, çünkü object'ler 8'e bölünen adreste başlar. Sonuçta 32 GB'a kadar adreslenebilir.

Heap'i 31 GB'tan 32 GB'a çıkar ve reference'ların boyutuna bak. Java 25'te compact object headers da var: header 12 byte yerine 8 byte tutar.