JVM, "mideni kıracağım"

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:

  • Program sayıcı
  • Sanal makine yığını
  • yığın
  • Yöntem alanı
  • Yerel yöntem yığını

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:

  • Java kodu JVM üzerinden çalıştığında, önce derlenmiş bayt kodu talimatlarını satır satır çalıştıracaktır.
  • Daha sonra, yürütme sürecinde, yöntem çağrısı için, Java sanal makine yığını aracılığıyla her yöntem için bir yığın çerçevesi oluşturulur ve yığın itilir ve açılır ve yığın çerçevesinde yöntemin yerel değişkenleri bulunur.
  • Nesnelerin oluşturulması için, bunlar Java yığın belleğine tahsis edilecektir.
  • Sınıf bilgilerinin depolanması için, yöntem alanı / Metaspace gibi bir alana yerleştirilecektir.
  • Ayrıca iki özel alan vardır:
  • Yerel yöntem yığını : Yerel yöntemi çalıştırırken kullanılan yığın, Java sanal makine yığınına benzer
  • Yığın dışı bellek : Bazı nesneleri depolamak için Java yığınının dışında bellek alanı ayırabilirsiniz.
"WANNA ONE" "News" 190617 Jiang Daniel, havaalanı fotoğrafları bile "resim ustası" olarak çekildi
önceki
190617 "Extreme Challenge" kaydı, Zhang Yixing'in "Gözlükleri Öldür" sahnelemesini vurdu
Sonraki
Ağızdan çıkan söz o kadar iyi ki gökyüzüne aykırı ama skor neredeyse kötü bir filme indirgeniyor ... Bu, Douban'ın karşısında dövüldüğü en kötü zamandı.
Bu yılın ilk yarısında, Pekin arazi pazarı iş amaçlı kullanım için 33 arsa sattı ve toplam işlem değeri 86.865 milyar yuan oldu.
Huirong, Agylstor M.4 NVMe SSD Prototipini Sergiliyor
Hong Kong Wireless'ın beş kaplanı var, ancak yeni beş kaplan olduğunu unutmayın. Son ikisini bilmek en iyisidir
Maldivler-Çin Dostluk Gecesi Resepsiyonu Pekin'de yapıldı
Altı Pan Jinlian oyuncusu var, ilk beşi eşsiz güzellikler, sadece sonuncusu çirkin
Realtek RT5261 master'ı sergiliyor: SD Express protokolünü destekler
"Malezya ile Çin arasında Diplomatik İlişkilerin Kuruluşunun 45. Yılını Kutlamak, Malezya ve Çin arasında ünlü hat ve resim sanatçılarının değişim toplantısı" Kuala Lumpur'da yapıldı.
"TFBOYS" "Haberler" 190616 Yi Yang Qianxi Weibo Film Gecesi büyük şovu, ilerideki yolda en samimi teşvik için teşekkürler
"Swing Drugs 2" nin bir milyarı aşması bekleniyor ve Andy Lau'nun yeni filmi hala "sefil" kelimesinden kaçamıyor
190616 Yi Yang Qianxi Weibo film gecesi büyük bir şov gibi görünüyor, ilerideki yolda en içten teşvik için teşekkürler
Hong Kong filmlerinin öldüğünü kim söyledi? Bu beş önemli noktayla, "Sweeping Drugs 2" nin iyi görünmesi zor.
To Top