JVM bellek alanları nelerdir? Heap, stack ve metaspace farkı nedir; hangi OutOfMemoryError türlerini görürsünüz?
Cevap
JVM belleği temelde heap (tüm thread'lerin paylaştığı nesne alanı), thread başına stack ve sınıf meta verisinin tutulduğu metaspace olarak ayrılır.
| Alan | Ne tutar | Paylaşım | Tipik hata |
|---|---|---|---|
| Heap | new ile oluşan nesneler, diziler | Tüm thread'ler | OutOfMemoryError: Java heap space |
| Stack | Metot çağrı frame'leri, lokal primitive'ler, referanslar | Thread başına | StackOverflowError (derin/sonsuz recursion) |
| Metaspace | Sınıf tanımları, metot meta verisi (Java 8+, native bellek) | Tüm JVM | OutOfMemoryError: Metaspace (classloader leak) |
| Direct / native | NIO ByteBuffer.allocateDirect, thread'lerin kendisi | Tüm JVM | Direct buffer memory, unable to create native thread |
Heap ayrıca young generation (Eden + Survivor) ve old generation olarak bölünür; çoğu nesne genç ölür, GC bu varsayıma göre çalışır.
Önemli ayarlar
java -Xms512m -Xmx2g \
-XX:MaxMetaspaceSize=256m \
-Xss1m \
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp \
-jar app.jarContainer içinde -Xmx sabitlemek yerine -XX:MaxRAMPercentage=75 kullanmak yaygındır; modern JVM'ler (10+) cgroup limitlerini algılar.
Bellek sızıntısı nasıl araştırılır?
- Heap dump alın (
jcmd <pid> GC.heap_dump /tmp/heap.hprof). - Eclipse MAT veya VisualVM ile "dominator tree"ye bakın.
- Tipik suçlular: büyüyen statik
Mapcache'leri, kapatılmayan kaynaklar,ThreadLocal'ların thread pool'larda temizlenmemesi.
İlgili Java & Spring soruları
- Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?
- ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?
- JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?
- @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.
- Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?
- Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.