JVM (Java Sanal Makinesi) ne iş yapar ve nasıl çalışır?
JVM, Java bytecode'unu çalıştıran ve bellek, çöp toplama gibi işleri yöneten çalışma ortamıdır. Mimarisini, işleyişini ve JDK ile farkını öğrenin.
JVM nedir?
JVM (Java Virtual Machine, Java Sanal Makinesi), Java ve diğer uyumlu dillerle yazılmış programların derlenmiş ara kodunu (bytecode) çalıştıran yazılım katmanıdır. Programı doğrudan işletim sistemine ve işlemciye bağlamak yerine, arada bir soyutlama sağlar. Bu soyutlama sayesinde aynı derlenmiş program, uygun bir JVM bulunan her platformda değişmeden çalışabilir; Java'nın bilinen yaklaşımı olan bir kez yaz, her yerde çalıştır fikri buna dayanır.
JVM yalnızca kod çalıştırmaz. Bellek ayırır ve temizler, iş parçacıklarını yönetir, sınıfları yükler ve güvenlik denetimlerini uygular. Bu yüzden Java programcısı çoğu zaman bellek adreslerini elle yönetmek zorunda kalmaz.
JVM, JRE ve JDK arasındaki fark
Bu terimler sık karıştırılır. JVM, bytecode'u çalıştıran sanal makinenin kendisidir. JRE (Java Runtime Environment), JVM ile birlikte standart sınıf kütüphanelerini içeren çalışma ortamıdır; Java uygulamasını çalıştırmak için gereken pakettir. JDK (Java Development Kit) ise JRE'nin üstüne derleyici, hata ayıklama ve profil araçları gibi geliştirici araçlarını ekler.
Bir uygulamayı geliştiren kişi JDK kullanır; sadece çalıştıran sistem ise çalışma ortamına ihtiyaç duyar. Güncel dağıtımlarda bu ayrım pakete göre değişebildiği için kullanılan dağıtımın belgesine bakmak gerekir.
JVM nasıl çalışır?
Çalışma akışı kabaca şöyledir. Geliştirici kaynak kodu Java derleyicisiyle bytecode içeren sınıf dosyalarına çevirir. JVM başlatıldığında sınıf yükleyici (class loader) gerekli sınıfları bulup belleğe alır. Ardından doğrulama aşaması bytecode'un güvenlik ve yapısal kurallara uyup uymadığını denetler. Sonrasında yürütme motoru bytecode'u çalıştırır: bir kısmını yorumlayarak (interpreter), sık çalışan kısımlarını ise JIT derleyiciyle makine koduna çevirerek.
Bu süreçte JVM, program çalışırken hangi yöntemin sık çağrıldığını izler ve optimizasyon kararlarını bu gözleme göre verir. Dolayısıyla Java programları ilk anlarda daha yavaş, ısındıktan sonra daha hızlı çalışma eğilimindedir.
Bellek bölgeleri ve çöp toplama
JVM belleği farklı amaçlı bölgelere ayırır. Nesnelerin yaşadığı yığın alanı (heap) uygulama boyunca oluşturulan nesneleri tutar. Her iş parçacığının kendine ait bir çağrı yığını (stack) vardır; yöntem çağrıları ve yerel değişkenler orada tutulur. Sınıf tanımları ve statik veriler ise ayrı bir meta bölgede saklanır.
Çöp toplayıcı (garbage collector), artık hiçbir yerden erişilemeyen nesneleri bularak belleği geri kazanır. Çöp toplama algoritmaları gecikme ve verim arasında farklı dengeler kurar; seçim, uygulamanın gecikmeye duyarlı mı yoksa yüksek işlem hacmine mi odaklı olduğuna bağlıdır. Bellek sızıntısı ise, aslında kullanılmayan nesnelere gizli referanslar kalması nedeniyle bellek geri kazanılamadığında ortaya çıkar.
Yalnızca Java değil
JVM, Java dilinden bağımsız bir çalışma ortamı olarak da kullanılır. Kotlin, Scala ve Groovy gibi diller de JVM bytecode'una derlenir; böylece aynı sanal makine, kütüphane ve araç zincirinden yararlanırlar. Bu, JVM ekosisteminin güçlü yanıdır: farklı dillerle yazılmış kod aynı çalışma ortamında birlikte kullanılabilir.
JVM üzerinde çalışan sunucu uygulamalarında kullanılan bellek boyutu, çöp toplayıcı seçimi ve iş parçacığı ayarları performansı doğrudan etkiler. Konteyner ortamında çalışırken JVM'in ayrılan kaynağı doğru algılaması ve buna göre ayarlanması ayrıca önemlidir.
Mindset programlarında nerede çalışılır?
Mindset kataloğundaki Java İleri Seviye: JVM Performans ve Bellek Yönetimi eğitimi, modül başlıklarına göre JVM mimarisi ve bellek bölgeleri, çöp toplama algoritmaları, profilleme ve gözlemlenebilirlik, JIT derleme ve eşzamanlılık konularını ayrıntılı işler; üretimde çalışan Java servislerinin performans sorunlarıyla uğraşan geliştiriciler için uygundur. Java ile Spring Boot ve Spring Cloud eğitimleri ise JVM üzerinde çalışan backend ve mikroservis geliştirmeye odaklanır ve JVM bilgisinin pratik uygulama alanını gösterir.
İlgili Mindset programı
Java İleri Seviye: JVM Performans ve Bellek Yönetimi
Sık sorulan sorular
JVM bir işletim sistemi midir?
Hayır. JVM işletim sisteminin üzerinde çalışan bir yazılım katmanıdır. İşletim sisteminden bellek ve işlemci zamanı alır, kendi içinde ise sanal bir çalışma ortamı sunarak bytecode'u yürütür. Her işletim sistemi için o sisteme uygun ayrı bir JVM gerekir.
Java neden platformdan bağımsız denir?
Java kaynak kodu doğrudan makine koduna değil, ara koda (bytecode) derlenir. Bu ara kod her platformdaki JVM tarafından anlaşılır. Platforma özgü farklılıkları JVM üstlendiği için aynı derlenmiş program farklı işletim sistemlerinde yeniden derlenmeden çalışabilir.
JVM ayarı yapmak ne zaman gerekir?
Varsayılan ayarlar çoğu uygulama için yeterlidir. Bellek tüketimi yüksekse, gecikme sıçramaları görülüyorsa ya da konteynerde kaynak sınırları aşılıyorsa profilleme ile nedeni ölçüp ayar yapmak gerekir. Ölçmeden ayar yapmak çoğunlukla sorunu çözmez.
JVM ile Node.js benzer şeyler midir?
İkisi de bir çalışma ortamıdır ama farklı dilleri çalıştırır. JVM Java bytecode'unu, Node.js ise JavaScript kodunu yürütür. Her ikisi de çalışma sırasında optimizasyon yapar; fakat bellek yönetimi, iş parçacığı modeli ve ekosistemleri birbirinden ayrılır.