İçeriğe atla
← Java ve JVM

· 1 dk okuma

JVM Bellek Alanları

Heap, metaspace, stack, PC register: hangi veri nerede durur, thread-safety ile ilişkisi nedir?

#java #jvm #bellek #thread

  • 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

  1. 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 Class nesnesinde tutulur.)
  2. Heap: Tüm nesne örnekleri ve diziler burada tutulur. GC’nin çalıştığı alandır.

Her thread’e özel

  1. 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.
  2. PC Register: O anda çalışan JVM instruction’ının adresi.
  3. 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