← Java ve JVM
JVM Bellek Alanları
Heap, metaspace, stack, PC register: hangi veri nerede durur, thread-safety ile ilişkisi nedir?
- JVM birkaç farklı depolama alanından oluşur.
- Bu alanların bazısı paylaşımlıdır: farklı thread’ler aynı alanı kullanır.
- Bazıları ise her thread için ayrı oluşturulur.
Thread’ler arasında paylaşılan
- Class (Method) Area: Sınıf yapıları, metot kodu, runtime constant pool, static alanlar.
(HotSpot’ta method area = Metaspace; static’lerin değerleri pratikte heap’teki
Classnesnesinde tutulur.) - Heap: Tüm nesne örnekleri ve diziler burada tutulur. GC’nin çalıştığı alandır.
Her thread’e özel
- Stack: Her metot çağrısı için stack’te bir frame oluşur. Frame; lokal değişkenler, operand stack (ara hesaplar) ve frame data (dönüş adresi vb.) içerir. Metot çağırısı bitince frame pop edilerek içerisindeki primitiveler ve referanslar silinir. Dolayısı ile GC ’in burada temizlik işi yoktur.
- PC Register: O anda çalışan JVM instruction’ının adresi.
- Native Method Stack: JNI ile çağrılan native metotlar için.
Ne nerede durur?
- Stack: lokal primitive değişkenler ve nesne referansları
- Heap: nesnenin kendisi ve diziler
- GC sadece Heap’i tarar.
Thread-safety örneği
Lokal değişkenler stack’te olduğu, stack ise thread’e özel olduğu için şu kod thread-safe’tir:
public int calculate(int x) {
int result = x * 2; // stack
return result;
}
Ancak şu kod thread-safe değildir:
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Çünkü nesneler heap’te durur. Heap ise ortak bir alandır, thread’e özel değildir.
Aynı kategoriden
Mutable ve Immutable Nesneler
Immutable nesnelerin özellikleri, ne zaman tercih edilmeli, avantaj ve dezavantajları örneklerle.
Java: Pass by Value ve Defensive Copy
Java gerçekten pass-by-value mı? Referansların kopyalanması ve defensive copy ile nesne bütünlüğünü koruma.
JDK, JRE ve JVM Arasındaki Fark
JDK, JRE ve JVM ne işe yarar, birbirini nasıl kapsar? Kısa karşılaştırma tablosuyla.