JVM Bellek Modeli: Heap, Stack, Metaspace & GC (G1 vs ZGC)
Java kodunuzun işletim sisteminde nasıl yer kapladığı ve çöplerin nasıl toplandığı.
Stack masanızın üstündeki not defteridir (metot bittiğinde sayfa yırtılır atılır). Heap ise ofisin ortak deposudur (bütün büyük kutular orada durur). Metaspace ise kütüphanedir (sınıf tanımları orada saklanır).
Stack: Her thread için özeldir, ilkel tipleri ve nesne referanslarını tutar. Heap: Tüm thread'lerin paylaştığı nesnelerin tutulduğu alandır (Young/Old gen). Metaspace: Class metadata'larını tutar. G1 GC dengeli bir toplayıcıyken, ZGC (Z Garbage Collector) duraklama sürelerini (STW - Stop The World) 1 milisaniyenin altına indirir.
“Stack LIFO mantığında çalışır ve çok hızlıdır. Heap dinamik tahsis edilen nesneleri barındırır. Modern Java'da (Java 17+) G1GC varsayılandır; mikrosaniye seviyesinde ultra-düşük gecikme (low-latency) gerektiren fintech projelerinde ise ZGC tercih edilir.”
// VM Parametreleri ile GC Seçimi:
// java -XX:+UseZGC -Xms4g -Xmx4g -jar app.jar
public class MemoryDemo {
public void test() {
int x = 10; // Stack
User u = new User(); // u referansı Stack, new User() nesnesi Heap!
}
}
Statik koleksiyonlara (List, Map) sürekli nesne ekleyip temizlememek; bu nesneler GC root tarafından tutulduğu için OutOfMemoryError (OOM) verir.