1. Daguai yükseltmesi, JVM'yi atlayamazsınız
2. JVM alan bölümü
3. Program sayacı
4. Java Sanal Makine Yığını
5. Java yığın belleği
6. Yöntem alanı / Metaspace
7. Yerel yöntem yığını
8. Yığın dışı bellek
9. Tam metin özeti
1. Daguai yükseltmesi, JVM'yi atlayamazsınız
Gelişmiş Java programcıları için JVM, atlatılamayacak veya aşılamayacak bir konudur.
Canavarların dönüşümünü yükseltme ve ilerletme yolunda, kaçınılmaz olarak çevrimiçi projede çeşitli OOM, GC ve diğer sorunlarla karşılaşacaksınız.Şu anda, JVM becerileri çok önemlidir.
Bu yazıda, kendi yazdığımız kodu çalıştırma ve JVM'nin "göbeğini açma" bakış açısından başlayacağız. Yazdığımız koda bir göz atın, JVM'nin her alanında ne yaptık?
Bir şey daha, Java mühendisleriyle yapılan röportaj için, JVM de sorunun bir parçasıdır, bu nedenle ister röportajdan ister gerçek çalışmadan olsun, JVM becerilerinizi pekiştirmeniz gerekir.
Biraz ileri gidin, hızlıca geri çekin ve hemen konuya girin!
2. JVM alan bölümü
Jvm alanı kabaca şu şekildedir:
Sonra, JVM'yi bir organizma olarak ele alacağız ve yukarıdaki parçalar onun farklı organlarıdır. JVM'deki bu "organların" Java kodumuzu nasıl kendi yazdığımız Java kodunun JVM üzerinden nasıl çalıştığı perspektifinden nasıl desteklediğini analiz edeceğiz.
3. Program sayacı
En temel HelloWorld olan aşağıdaki sınıfa sahip olduğumuzu varsayalım:
public class HelloWorld {
public static void main (String args) {
System.out.println ("Merhaba Dünya");
}
}
Yukarıdaki kod ilk olarak dosyada java kaynak kod dosyası olan ".java" sonekiyle var olacaktır.
Ancak bu dosya programcılarımız içindir ve bilgisayarlar bu kodu anlayamaz.
Bu nedenle, ".java" son ekine sahip kaynak kodu dosyası, şu anda derleyici aracılığıyla ".class" sonekiyle bayt kodu dosyasına derlenmelidir.
".Class" sonekine sahip bayt kodu dosyası, yazdığınız kodun derlenmiş bayt kodunu içerir.
Bytecode, yazdığımız kodların değil, hesap makinesinin anlayabileceği bir dildir. Bayt kodu şöyle görünür:
Not : Bu bayt kodu tamamen HelloWorld sınıfına karşı yazılmamıştır.Sadece herkese ".java" nın ".class" a neyin çevrildiğini bildirmek için bir örnek vermek içindir.
Muhtemelen size açıklayacağım.Örneğin, şekildeki "0: aload_0", bir makine komutuna karşılık gelen bir "bayt kodu talimatı" dır.Sadece bilgisayar bu makine kodu talimatını okuduğunda ne yapması gerektiğini bilebilir.
Örneğin, bayt kodu talimatları bilgisayarın bellekten belirli verileri okumasına veya belirli verileri belleğe yazmasına neden olabilir. Çeşitli talimatlar bilgisayara çeşitli şeyler yapması talimatını verecektir.
İşte herkesin ilk anladığı ilk nokta: Java kodu bayt koduna çevrilir ve farklı bayt kodu talimatları, bilgisayarı farklı şeyler yapmaya yönlendirir.
Peki, bayt kodu komutlarını çalıştırırken JVM'deki program sayacının işlevi nedir?
cevap: Her evre tarafından o anda yürütülen bayt kodu talimatının konumunu kaydetmek için kullanılır, yani, geçerli evre tarafından o anda hangi bayt kodu talimatının yürütüldüğünü kaydetmek için kullanılır.
Pratikte, aynı anda farklı kodları çalıştıran birden fazla iş parçacığı olacaktır, bu nedenle Her iş parçacığının kendi program sayacı vardır , Hangi bayt kodu talimatını geçerli iş parçacığının çalıştırdığını özellikle kaydeder.
Aşağıdaki resim aralarındaki ilişkiyi daha net göstermektedir.
4. Java Sanal Makine Yığını
Tamam, bir bakalım. Herkesin bildiği gibi, Java kodu yürütüldüğünde, kodu bir yöntemde yürütmek için bir iş parçacığı olmalıdır. En basit HelloWorld bile, kodu ana yöntemde yürütmek için bir ana iş parçacığına sahip olacaktır.
Bir yöntemde, yöntemdeki bazı yerel değişkenler genellikle aşağıdaki gibi tanımlanır, yöntemde yerel bir değişken "adı" tanımlanır.
public void sayHello () {
Dize adı = "merhaba";
}
Dolayısıyla, JVM'mizin bu "organı" görünmek üzere.JVM, her yöntemde yerel değişkenleri ve diğer verileri depolamak için bir alana sahip olmalıdır.Bu alan, Java sanal makine yığınıdır.
Bu alana neden ihtiyaç var? Her iş parçacığı çeşitli yöntemlerin kodunu yürüteceği ve diğer yöntemler yöntemin içinde yuvalanacağı için, Her iş parçacığı kendi Java sanal makine yığınına sahip olmalıdır .
İş parçacığı bir yöntemi yürütürse, bu yöntem çağrısı için karşılık gelen bir tane oluşturulur. Yığın çerçevesi
Yığın çerçevesinde bu yöntemin yerel değişken tablosu, işlemsel yığın, dinamik bağlantı, yöntem çıkışı ve diğer şeyler vardır. Buradaki diğer şeylerin anlaşılması kolay değil, daha sonra diğer makaleleri ayrıntılı olarak açıklayacağız, burada ilk önce yerel bir değişkeni anlayabiliriz.
Yukarıdaki örneğe dönersek, örneğin, bir iş parçacığı yukarıda yazılan "sayHello" yöntemini çağırır, ardından "sayHello" yöntemi için bir yığın çerçevesi oluşturulur ve iş parçacığının kendi Java sanal makine yığınına gönderilir.
Yığın çerçevesinin yerel değişken tablosunda "ad" adında bir yerel değişken olacaktır.Aşağıdaki şekil bu süreci göstermektedir.
Daha sonra, "sayHello" yöntemi aşağıdaki kod gibi başka bir "karşılama" yöntemini çağırırsa:
Şu anda, "selamlama" yöntemi için bir yığın çerçevesi oluşturulur ve iş parçacığının Java sanal makine yığınına gönderilir.
Bunun neden olduğunu bir düşünün? Selamlama yöntemi sayHello yönteminde yürütüldüğünden ve selamlama yönteminin yerel değişkeni olan selamlama yönteminin yığın çerçevesinin yerel değişken tablosunda bir "greet" değişkeni vardır.
Aşağıdaki şekil bu süreci göstermektedir:
Daha sonra "selamlama" yöntemi çalıştırılırsa, "tebrik" yöntemine karşılık gelen yığın çerçevesi Java sanal makine yığınından verilecek ve ardından "sayHello" yöntemi de çalıştırılırsa "sayHello" yöntemi de eklenecektir. Java sanal makine yığınından açılır.
Bu, Java sanal makine yığınının JVM'deki rolüdür.
Herkesin hatırlaması gereken şey: Herhangi bir yöntemi çağırırken ve yürütürken, yöntem için bir yığın çerçevesi oluşturulur ve ardından yığına gönderilir.
Bu yönteme karşılık gelen yerel değişkenler gibi veriler, bu yöntemin yürütülmesiyle ilgili diğer bilgiler dahil olmak üzere yığın çerçevesinde depolanır ve yöntem yürütüldükten sonra yığın açılır.
5. Java yığın belleği
JVM'de, aşağıdaki kod gibi kodda oluşturduğumuz çeşitli nesneleri depolamak için kullanılan Java yığını olan çok kritik bir alan daha var:
public void teach (String name) {
Öğrenci öğrenci = yeni Öğrenci (isim);
student.study ();
}
Yukarıdaki "yeni Öğrenci (adı)", bazı verileri içeren Öğrenci türünün bir nesne örneğini oluşturur. Öğrenci gibi nesneler Java yığın belleğinde saklanacaktır.
Daha sonra yöntemin yığın çerçevesinin yerel değişken tablosunda, bu referans türü "öğrenci" yerel değişkeni Öğrenci nesnesinin adresini saklayacaktır. Yerel değişken tablosundaki "öğrenci" nin Java yığınındaki Öğrenci nesnesini gösterdiğini düşünebilirsiniz.
Aşağıdaki şekil bu süreci göstermektedir:
6. Yöntem alanı / Metaspace
Bu yöntem alanı, JDK 1.8'den önceki sürümde yer almaktadır. JVM'de bir alanı temsil eder.Genellikle Öğrenci sınıfının kendisine benzer bilgileri depolamak için kullanılır.Sıradan zamanlarda kullanılan çeşitli sınıfların bilgileri bu alana yerleştirilir. Bu alandaki sabit havuza benzer bir şey olacak.
Ancak JDK 1.8'den sonra bu alanın adı değiştirilmiş ve adı "Metaspace" olarak adlandırılabilecek "Metaspace", tabi ki ağırlıklı olarak kendimize yazdığımız çeşitli türdeki bilgileri depolar.
7. Yerel yöntem yığını
GÇ ile ilgili, NIO ile ilgili ve ağ soketiyle ilgili gibi JDK'nın birçok düşük seviyeli API'sinde, dahili kaynak koduna bakarsanız, birçok yerin Java kodu olmadığını göreceksiniz.
Birçok yerde yerel yöntemler, yerel işletim sistemindeki bazı yöntemleri çağırmak için kullanılır. C dilinde yazılmış yöntemleri veya aşağıdakiler gibi bazı temel sınıf kitaplıklarını çağırabilirler:
genel yerel int hashCode ();
Bu yerel yöntem çağrıldığında, iş parçacığına karşılık gelen, Java sanal makine yığınına benzeyen ve ayrıca çeşitli yerel yöntemlerin yerel değişken tabloları gibi bilgileri depolayan yerel bir yöntem yığını olacaktır.
Bununla ilgili olarak, burada tartışmayacağım ve daha sonra açıklamak için özellikle bir makale yazacağız.
8. Yığın dışı bellek
Ayrıca JVM'ye ait olmayan bir alan da vardır.NIO'daki ayırmaDirect API'si aracılığıyla, Java yığınının dışında bellek alanı tahsis edilebilir ve ardından öbek dışındaki bellek alanı Java sanal makinesinde DirectByteBuffer aracılığıyla referans alınabilir ve manipüle edilebilir.
Birçok teknoloji bu yöntemi kullanır, çünkü yığın dışı bellek ayırmanın performansı artırabileceği bazı senaryolar vardır.
9. Tam metin özeti
Son olarak bir özet yapın: