Java Sanal Makinesi (JVM), Java bayt kodu programlarını yürütmekten sorumlu, Java yürütme ortamının çok önemli bir bileşenidir. JVM'nin önemli bir avantajı olan, Java uygulamalarının çeşitli donanım mimarileri ve işletim sistemlerinde sorunsuz bir şekilde çalışmasını sağlayan tutarlı, platformdan bağımsız bir yazılım ortamı sağlar.
Java uygulamaları tipik olarak Java programlama dilinde yazılır, bayt kodu biçiminde (*.class dosyaları) derlenir ve ardından JVM tarafından yüklenir ve yürütülür. JVM, bayt kodunu temeldeki işletim sistemi ve donanıma özgü yerel makine koduna çevirir; bu, Java uygulamalarının değiştirilmeden birden çok platformda çalışmasına izin verir. Bu süreç genellikle "Bir Kez Yaz, Her Yerde Çalıştır" ilkesi olarak adlandırılır.
Ayrıca, JVM bellek yönetimi, çöp toplama ve çalışma zamanı optimizasyonu ile ilgilenerek onu Java programlarının verimli bir şekilde yürütülmesi için önemli bir bileşen haline getirir.
JVM Bileşenleri ve İşlevleri
JVM mimarisi, Java uygulamalarının yaşam döngüsünü yönetmek için birlikte çalışan birkaç bileşenden oluşur. Bu bileşenler şunları içerir:
- Classloader: Classloader, Java sınıflarını diskten JVM belleğine yüklemekten, sınıf bağımlılıklarını çözmekten ve program çalışırken sınıfları başlatmaktan sorumludur. Classloader, Bootstrap Classloader ile başlayan, Extension Classloader ve Application Classloader ile devam eden bir temsil hiyerarşisini takip eder.
- Çalışma Zamanı Veri Alanları: JVM, programın yürütülmesi sırasında Çalışma Zamanı Veri Alanları adı verilen bellek alanlarını tahsis eder. Bu bellek alanları, uygulamanın yaşam döngüsünün farklı yönleri için gerekli verileri depolayan Yığın, Yığın, Yöntem Alanı, Sabit Havuz ve PC Kayıtlarını içerir.
- Yürütme Motoru: Yürütme Motoru, Java bayt kodunu yürütmekten sorumlu temel bileşendir. Yürütme motoru, bayt kodunu yorumlar ve çalışma zamanı sırasında yerel makine koduna dönüştürür. Tercüman, Tam Zamanında (JIT) Derleyici ve Çöp Toplayıcı gibi bileşenleri içerir.
İlerleyen bölümlerde, JVM bellek yönetiminin ayrıntılarına ve JVM mimarisini oluşturan çeşitli bellek alanlarına daha derinlemesine dalacağız.
JVM Bellek Yönetimi
Etkili bellek yönetimi, Java uygulamalarının verimli bir şekilde yürütülmesine katkıda bulunan JVM mimarisinin önemli bir yönüdür. JVM, programın yürütülmesi sırasında farklı veri depolama ve işleme türlerini işlemek için Çalıştırma Zamanı Veri Alanları adı verilen çeşitli bellek alanlarını tahsis eder. JVM'deki ana bellek alanları şunları içerir:
- Yığın: Yığın, JVM'deki en büyük bellek alanıdır ve uygulamadaki tüm iş parçacıkları arasında paylaşılır. Programın yürütülmesi sırasında oluşturulan örneklenmiş nesneleri ve dizileri depolar. Yığın ayrıca 'Genç Nesil' ve 'Eski Nesil' alanlarına ayrılmıştır. Genç Nesil alanı, yeni oluşturulan nesneleri depolarken, Eski Nesil alanı, birden fazla çöp toplama döngüsünden kurtulan nesneleri içerir.
- Yığın: JVM, her iş parçacığı için ayrı bir yığın oluşturur. Yığınlar, bir programın yürütülmesi sırasında yöntem çağrı bilgilerini, yerel değişkenleri ve hesaplamaların ara sonuçlarını depolar. Bir yığındaki her giriş, Yığın Çerçevesi olarak adlandırılır ve JVM, her yöntem çağrısı için Yığın Çerçevelerini bağımsız olarak yönetir.
- Yöntem Alanı: Yöntem Alanı, uygulamadaki tüm iş parçacıkları arasında paylaşılır ve yöntem adları, değişken adları ve sabit değerler gibi sınıf verilerini depolar. Yöntem Alanı ayrıca bayt kodu tarafından kullanılan sabit değerleri ve sembolik referansları tutan bir Sabit Havuz içerir.
- PC Kayıtları: PC (Program Sayacı) Kaydı, her iş parçacığı için halihazırda yürütülmekte olan JVM komutunun adresini içeren bir hafıza alanıdır. PC Kaydı, JVM'nin bir sonraki adımda hangi komutu çalıştıracağını izlemesine yardımcı olur.
Bu bellek alanlarının yanı sıra JVM, artık gerekli olmayan nesneler için belleği otomatik olarak yeniden tahsis eden, böylece bellek sızıntılarını azaltan ve kaynak kullanımını optimize eden bir Çöp Toplayıcı kullanır.
Özetle, JVM mimarisi, Java uygulamalarının yürütülmesini optimize eden ve verimli kaynak kullanımını sağlayan, iyi tanımlanmış bir bellek yönetim sistemine sahiptir. JVM'nin bileşenlerini ve işlevlerini anlamak, geliştiricilerin mümkün olan en iyi performans için Java uygulamaları oluşturmasına ve optimize etmesine olanak tanır.
JVM Sınıf Yükleyici
Classloader, Java sınıflarını JVM belleğine yükleyen Java Sanal Makinesinin (JVM) hayati bir bileşenidir. Üç önemli faaliyetten sorumludur: yükleme, bağlama ve başlatma. Gelin bu etkinlikleri ayrıntılı olarak inceleyelim.
Yükleniyor
Yükleme, sınıf dosyalarını diskten alıp JVM belleğine yükleme işlemidir. Classloader, paket adını ve sınıf adını içeren tam nitelikli sınıf adını kullanarak gerekli sınıf dosyalarını bulur. JVM'de üç tür Sınıf Yükleyici vardır:
- Bootstrap Classloader: Bu, JVM'nin yerleşik Classloader'ıdır ve
java.lang.Object
gibi temel Java sınıflarını vert.jar
dosyasından diğer çalışma zamanı sınıflarını yükler. - Uzantı Sınıf Yükleyici: Bu Sınıf Yükleyici, JDK'nın ek Java kitaplıklarını ve çerçevelerini içeren
ext
dizininden sınıfları yüklemekten sorumludur. - Sistem/Uygulama Sınıf Yükleyicisi: Varsayılan Sınıf Yükleyici, sınıfları uygulamanın sınıf yolundan yükler. Sınıf yolu, bir Java uygulaması yürütülürken
-cp
veya-classpath
seçenekleri kullanılarak belirtilebilir.
Classloader, Bootstrap Classloader ile başlayan ve Extension ve System/Application Classloader'lara inen bir yetkilendirme hiyerarşisini takip eder.
Görüntü kaynağı: Java Eğitim Ağı
bağlama
Bağlama işlemi, sınıf bağlantıları kurar ve tutarsızlıkları veya hataları kontrol eder. Bağlama üç adımdan oluşur:
- Doğrulama: Bu adım sırasında JVM, yüklenen sınıf dosyalarının Java Dil Spesifikasyonunda belirtilen yapıya ve kısıtlamalara uymasını sağlar. Hatalı biçimlendirilmiş veya kötü amaçlı sınıf dosyaları bu aşamada reddedilecektir.
- Hazırlık: JVM, sınıfın yürütülmesi için gereken statik alanları, yöntemleri ve diğer kaynakları başlatır. Statik alanlara varsayılan değerler atar ve bunlar için bellek ayırır.
- Çözünürlük: Bu adım, sınıf dosyalarındaki sembolik başvuruları, yöntem adresleri ve alan uzaklıkları gibi doğrudan başvurularla değiştirerek çözer. Bu işlem çalışma zamanında dinamik olarak gerçekleştirilir.
Başlatma
Başlatma, Classloader işleminin son adımıdır. Bu aşamada JVM, sınıftaki tüm statik kod bloklarını çalıştırır ve sınıf dosyasında belirtilen başlangıç değerlerini statik alanlara atar. Ayrıca, çok iş parçacıklı ortamlarda bile statik başlatmanın yalnızca bir kez gerçekleşmesini sağlar.
JIT Derleyici ve Çöp Toplayıcı
Tam Zamanında (JIT) Derleyici ve Çöp Toplayıcı, uygulama performansını önemli ölçüde optimize eden ve sistem kaynaklarını yöneten temel JVM bileşenleridir.
JIT Derleyici
Tam Zamanında (JIT) Derleyici, çalışma zamanında Java bayt kodunu yerel makine koduna dönüştürmekten sorumludur. Bu işlem, Java uygulamalarının yürütme hızını optimize eder. JIT Derleyicisi, sık çağrılan yöntemleri derler, derlenen kodu önbelleğe alır ve bunu gelecekteki yürütmelerde yeniden kullanarak bayt kodunu tekrar tekrar yorumlama yükünü azaltır.
JVM, sık çağrılan yöntemleri tanımlamak için bir "etkin nokta algılama" yöntemi kullanır. Hotspot eşiğine ulaşıldığında, JIT Derleyici devreye girer ve bayt kodunu yerel makine koduna derler. CPU, bu derlenmiş kodu doğrudan çalıştırarak önemli ölçüde daha hızlı yürütme sürelerine yol açar.
Çöp toplayıcı
Çöp Toplayıcı (GC), bellek yönetiminin otomatikleştirilmesinden sorumlu temel bir JVM bileşenidir. Uygulamanın artık ihtiyaç duymadığı veya referans vermediği nesnelerden belleği serbest bırakır. Bu işlem, bellek sızıntılarını en aza indirir ve Java uygulamalarında kaynak kullanımını optimize eder. JVM, yığın hafızasını Genç ve Yaşlı nesillere bölen nesilsel bir çöp toplama stratejisi kullanır. Genç Nesil ayrıca Eden Space, Survivor Space 0 (S0) ve Survivor Space 1 (S1) olarak alt bölümlere ayrılmıştır.
Nesiller boyu çöp toplamanın ardındaki temel fikir, çoğu nesnenin kısa bir ömre sahip olması ve büyük ihtimalle oluşturulduktan hemen sonra çöplerin toplanmasıdır. Bu nedenle, Genç Nesil'de belleği sık sık tahsis etmek ve yeniden yerleştirmek, çöp toplama sürecini optimize eder. Çöp Toplayıcı, Mark-Sweep-Compact, Copying ve Generational Collection gibi çeşitli algoritmaları kullanarak yığın belleğindeki kullanılmayan nesneleri temizler.
JVM Çalışma Zamanı Veri Alanları
JVM Çalıştırma Zamanı Veri Alanları, JVM tarafından programın yürütülmesi sırasında verileri depolamak için ayrılan bellek alanlarıdır. Bu veri alanları, kaynakları yönetmek ve Java uygulamalarının verimli bir şekilde yürütülmesini kolaylaştırmak için gereklidir. JVM'deki ana çalışma zamanı veri alanları, Yığın, Yığın, Yöntem Alanı, Sabit Havuz ve PC Kayıtlarını içerir.
Yığın
Yığın, JVM'de nesneleri ve örnek değişkenleri depolayan paylaşılan bir bellek alanıdır. En geniş hafıza alanıdır ve Çöp Toplayıcı bölümünde anlatıldığı gibi verimli çöp toplama için kuşaklara bölünmüştür. Öbek içindeki nesnelere genel olarak erişilebildiğinden, çok iş parçacıklı uygulamalarda veri tutarsızlığı sorunlarını önlemek için iş parçacığı eşitleme mekanizmaları gerekir.
Yığın
Yığın, yerel değişkenleri ve yöntem çağrı bilgilerini depolayan bir bellek alanıdır. JVM'deki her iş parçacığının kendi yığını vardır ve yığında depolanan verilere yalnızca ilgili iş parçacığının kapsamında erişilebilir. Sonuç olarak, yığın belleği erişimi için iş parçacığı senkronizasyonu gerekli değildir. Yığın, verileri depolamak ve almak için Son Giren İlk Çıkar (LIFO) yöntemini kolaylaştırarak, yöntem çağrısı yürütmeyi yönetmek için verimli hale getirir.
Yöntem Alanı
Yöntem Alanı, yüklenen her sınıf için meta verileri, sabit havuz bilgilerini ve statik alanları depolayan paylaşılan bir bellek alanıdır. Bu alan, sınıfla ilgili bilgileri yönetmek ve dinamik bağlantı ve bayt kodu yürütme için gereken verileri sağlamak için çok önemlidir.
Sabit Havuz
Sabit Havuzu, Java bayt kodu tarafından başvurulan dize hazır değerleri, sınıf adları ve yöntem adları gibi sabitleri depolayan Yöntem Alanındaki bir veri yapısıdır. Tüm sabit değerler için merkezi bir havuz görevi görür ve bağlama işlemi sırasında sembolik referansların çözülmesine yardımcı olur.
PC Kayıtları
Program Sayacı (PC) Kaydı, her iş parçacığı için o anda yürütülen Java bayt kodu yönergesinin adresini saklayan bir bellek alanıdır. PC Kaydı, iş parçacığı yürütmeyi yönetmeye ve JVM'deki talimat yürütme sırasını korumaya yardımcı olur. Yürütülecek bir sonraki bayt kodu komutunun bellek adresini içerir ve değeri, JVM Java bayt kodu yönergelerini işlerken buna göre güncellenir.
JVM Mimarisinin Faydaları ve Sınırlamaları
Java Sanal Makinesi (JVM) mimarisi, onu geliştiriciler için popüler bir seçim haline getiren çok sayıda avantaj sunar. Ancak, hiçbir sistem sınırlamaları olmadan değildir. Bu bölüm, JVM mimarisinin avantajlarına ve dezavantajlarına genel bir bakış sağlar.
JVM Mimarisinin Faydaları
- Platform Bağımsızlığı: JVM'nin en önemli avantajlarından biri platform bağımsızlığıdır. JVM sayesinde Java uygulamaları herhangi bir kod değişikliği gerektirmeden çeşitli platformlarda çalışabilmektedir. JVM, Java bayt kodunu altta yatan platforma özgü yerel makine koduna çevirerek farklı donanım ve işletim sistemlerinde sorunsuz yürütme sağlar.
- Ölçeklenebilirlik: JVM, çoklu kullanım yetenekleri ve bellek yönetimi özellikleri sayesinde büyük ölçekli uygulamaları verimli bir şekilde işlemek için tasarlanmıştır. Bu özellikler, geliştiricilerin performanstan ödün vermeden birçok kullanıcıya hizmet verebilecek uygulamalar oluşturmasına ve sürdürmesine olanak tanır.
- Bellek Yönetimi: JVM'nin bellek yönetim sistemi, sistem kaynaklarının optimum şekilde kullanılmasını sağlar. Farklı bellek alanları (Yığın, Yığın, Yöntem Alanı ve PC Kaydı) aracılığıyla belleği yönetir ve artık ihtiyaç duyulmayan nesneler tarafından kullanılan belleği otomatik olarak geri kazanmak için çöp toplama sağlar, bellek sızıntılarını azaltır ve uygulama performansını artırır.
- Optimize Edilmiş Bayt Kodu Yürütme: JVM, Java bayt kodunun yürütülmesini optimize etmek için Tam Zamanında (JIT) derlemesini kullanır. JIT derleyicisi, çalışma zamanı sırasında bayt kodunu yerel makine koduna çevirir ve sık sık çağrılan yöntemleri derleyerek ve derlenen kodu ileride kullanmak üzere önbelleğe alarak Java uygulamalarının genel yürütme hızını artırır.
- Çöp Toplama: JVM'nin otomatik çöp toplama özelliği, kullanılmayan nesneler tarafından işgal edilen bellek alanlarını yeniden tahsis ederek belleği verimli bir şekilde yönetir. Çöp toplama, Java uygulama performansını artırır ve geliştiriciler için bellek yönetimi görevlerini basitleştirir.
JVM Mimarisinin Sınırlamaları
- Performans Ek Yükü: JVM, yorumlama ve derleme süreçleri nedeniyle bazı performans ek yükü getirir. Bayt kodunun yorumlanması ve çalıştırma sırasında yerel makine koduna dönüştürülmesi, doğrudan makine koduna derlenen dillerde yazılan uygulamalardan daha yavaş yürütmeye yol açabilir.
- Bellek Kullanımı: JVM'nin sınıf yükleyici, yürütme motoru ve çalışma zamanı veri alanları gibi çeşitli bileşenleri sistem belleğini kullanır. Bu artan bellek kullanımı, kaynakları kısıtlı cihazlarda çalışan uygulamaları etkileyerek performansın düşmesine neden olabilir.
- Çöp Toplama Hıçkırıkları: JVM'nin çöp toplama özelliği sayısız fayda sağlar, ancak doğru şekilde optimize edilmezse performansta aksaklıklara da neden olabilir. Örneğin, çöp toplayıcı, "dünyayı durdurma" duraklamaları olarak adlandırılan tam bir çöp toplama döngüsü gerçekleştirmek için uygulama yürütmeyi duraklatabilir. Bu duraklamalar, özellikle yüksek verimli senaryolarda uygulama performansını önemli ölçüde etkileyebilir.
JVM ve AppMaster.io : No-code Geliştirmeyi Geliştirme
AppMaster.io , hızlı bir şekilde arka uç, web ve mobil uygulamalar oluşturmak için tasarlanmış güçlü bir kodsuz platformdur. Platform, kullanıcıların sezgisel bir sürükle ve bırak arabirimini kullanarak görsel olarak veri modelleri , iş mantığı ve kullanıcı arabirimleri oluşturmasına olanak tanır.
Gereksinimler değiştiğinde uygulamaları sıfırdan yeniden oluşturarak ve böylece teknik borcu ortadan kaldırarak uygulama oluşturma, derleme ve devreye alma işlemlerini gerçekleştirir. Kapsamlı yetenekleriyle AppMaster.io, JVM mimarisinden çeşitli şekillerde de yararlanabilir:
- Java Tabanlı Araçlar ve Kitaplıklar: JVM'nin Java tabanlı araçlardan ve kitaplıklardan oluşan kapsamlı ekosistemi, AppMaster.io kullanılarak oluşturulan uygulamalarda devreye alınabilir. Java kitaplıklarını entegre etmek, uygulamaların yeteneklerini önemli ölçüde artırabilir ve yaygın geliştirme görevlerine çözümler sağlayarak geliştirme süresinden tasarruf sağlayabilir.
- Ölçeklenebilirlik: JVM'nin çoklu iş parçacığı ve bellek yönetimi gibi ölçeklenebilirlik özellikleri, kullanıcı tabanı büyüdükçe etkili bir şekilde ölçeklenen uygulamalar oluşturmak için kullanılabilir. AppMaster.io, JVM özelliklerini birleştirerek farklı işletim sistemleri ve cihazlarda yüksek oranda ölçeklenebilir uygulamalar oluşturmaya yardımcı olabilir.
- Optimize Edilmiş Performans: Tam Zamanında (JIT) derleme ve otomatik çöp toplama gibi JVM'nin optimizasyon özellikleri, AppMaster.io tarafından oluşturulan uygulamaların performansını daha da artırabilir. Bu optimizasyonlar, uygulama kaynağı kullanımının en üst düzeye çıkarılmasına yardımcı olarak AppMaster.io tarafından oluşturulmuş uygulamaların daha hızlı ve daha verimli çalışmasına olanak tanır.
- Bellek Yönetimi: AppMaster.io, sistem kaynaklarını verimli bir şekilde kullanmak, bellek sızıntılarını azaltmak ve uygulama performansını iyileştirmek için JVM'nin bellek yönetimi özelliklerinden yararlanabilir.
Sonuç olarak, JVM'nin mimarisi, çeşitli özellikleri ve avantajlarıyla, AppMaster.io kullanılarak oluşturulmuş uygulamaların performansını ve yeteneklerini geliştirebilir. AppMaster.io, JVM'nin kapsamlı ekosisteminden ve optimizasyon özelliklerinden yararlanarak kullanıcılara daha da güçlü ve verimli no-code geliştirme araçları sağlayabilir.