1. 程式人生 > >JVM (一)--執行整體流程

JVM (一)--執行整體流程

面試:面試被問到JVM,竟然對JVM這幾個字母沒反應過來,後面也就答了JVM的記憶體管理和GC演算法,答得模稜兩可。

寫給自己:JVM一直都是Java中很重要基礎知識,是面試中必問的知識點。如果連JVM都弄不清楚,還談什麼Java開發。

執行流程

Java語言宣稱:一次編譯,到處執行

實現如下:

1)Java程式經過一次編譯後,將Java程式碼編譯為位元組碼檔案(.class檔案);

2)然後在不同的作業系統下依靠不同的JVM進行解釋;

3)最後再轉換為不同平臺的機器碼,最終得到執行。

 

下面看看一個普通的Java程式執行流程:

public class HelloWorld {

        public static void main(String[] args) {

                  System.out.println("Hello world");

         }

}

這段HelloWorld程式從編譯到執行,到最終打印出“Hello World”,中間經過的步驟:

1)Java程式程式碼通過編譯後生成位元組碼檔案(.class檔案);

2)通過Java HelloWorld執行,此時根據系統版本找到jvm.cfg並載入;

3)根據配置檔案(jvm.cfg)找到jvm.dll,jvm.dll是jvm的主要實現;

4)接下來初始化jvm,獲取JNI介面,JNI是java本地介面,用於找到.class檔案並裝載到jvm裡;

5)最後找到main方法並執行。

 

記憶體空間

方法區:各個執行緒的共享區域,存放類資訊、常量、靜態變數。

Java堆:各個執行緒的共享區域,存放類例項。一個系統會產生很多類例項,所有Java堆的空間也是最大的。

如果Java堆空間不足,程式將會丟擲OutOfMemoryError異常。

Java棧:每個執行緒的私有區域,Java棧的生命週期和執行緒的生命週期相同,一個執行緒對應一個Java棧;

每執行一個方法,就會往棧中壓入一個元素,這個元素叫“棧幀”,而“棧幀”中儲存了方法中的區域性變數、用於存放中間狀態值的操作棧等。如果棧空間不足,程式丟擲StackOverflowError異常。這是因為遞迴太深,執行大量方法,Java棧空間太大。

本地方法棧:本地方法棧的角色和Java棧類似,只不過本地方法棧是用來表示執行本地方法的,本地方法棧儲存的方法呼叫本地方法介面,最終呼叫本地方法庫,實現與作業系統、硬體互動的目的。

PC暫存器(程式計數器):控制程式指令在執行(調配指令順序)。

類載入完後,例項物件(Java堆)、方法(Java棧)、靜態變數(方法區)都已經存放在對應的記憶體空間,此時就需要PC暫存器(程式計數器)來控制程式指令的執行了。

執行引擎:執行指令。