'面試官:java程序是怎麼執行的?你:.....別再傻傻的笑說不知道了'

"

什麼是Java虛擬機?

要弄明白Java程序的執行過程首先要了解一下Java虛擬機

虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java虛擬機屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。

Java虛擬機(Java Virtual Machine簡稱JVM)是運行所有Java程序的抽象計算機,是Java語言的運行環境,它是Java 最具吸引力的特性之一。--百度百科

可以看到,Java虛擬機是在原有計算機的基礎上虛擬出來的抽象計算機,提供Java程序的運行環境。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需要生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。JVM是Java平臺無關的基礎,使Java程序能夠做到 “Write Once, Run Anywhere”。

Java程序執行過程

那有了Java程序的運行環境等一些列支持後,Java程序是如何做到從一個只有代碼的.java源文件變成計算機可執行的文件的呢? 如下圖,是Java程序的執行過程。

"

什麼是Java虛擬機?

要弄明白Java程序的執行過程首先要了解一下Java虛擬機

虛擬機是一種抽象化的計算機,通過在實際的計算機上仿真模擬各種計算機功能來實現的。Java虛擬機有自己完善的硬體架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java虛擬機屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。

Java虛擬機(Java Virtual Machine簡稱JVM)是運行所有Java程序的抽象計算機,是Java語言的運行環境,它是Java 最具吸引力的特性之一。--百度百科

可以看到,Java虛擬機是在原有計算機的基礎上虛擬出來的抽象計算機,提供Java程序的運行環境。JVM屏蔽了與具體操作系統平臺相關的信息,使得Java程序只需要生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。JVM是Java平臺無關的基礎,使Java程序能夠做到 “Write Once, Run Anywhere”。

Java程序執行過程

那有了Java程序的運行環境等一些列支持後,Java程序是如何做到從一個只有代碼的.java源文件變成計算機可執行的文件的呢? 如下圖,是Java程序的執行過程。

面試官:java程序是怎麼執行的?你:.....別再傻傻的笑說不知道了

大致過程就是,我們寫好的.java文件(源文件)被編譯器編譯後變成.class文件(字節碼),然後被JVM的類加載器加載到內存,通過字節碼校驗器去做一些校驗,校驗通過後交由解釋器將字節碼文件解釋成計算機能夠識別的機器指令。

維基百科

字節碼:字節碼是已經經過編譯,但與特定機器碼無關,需要解釋器轉譯後才能成為機器碼的中間代碼。

Java字節碼:是Java虛擬機執行的一種指令格式。

解釋器:是一種電腦程序,能夠把高級編程語言一行一行直接翻譯運行。解釋器不會一次把整個程序翻譯出來,只像一位“中間人”,每次運行程序時都要先轉成另一種語言再作運行,因此解釋器的程序運行速度比較緩慢。它每翻譯一行程序敘述就立刻運行,然後再翻譯下一行,再運行,如此不停地進行下去。它會先將源碼翻譯成另一種語言,以供多次運行而無需再經編譯。其製成品無需依賴編譯器而運行,程序運行速度比較快

通過上圖我們知道Java程序的執行會經過一下幾個步驟:​編譯-->裝載字節碼-->校驗字節碼-->解釋字節碼-->執行,然後我們看一下這幾個步驟具體執行過程,以及Java程序的執行過程對應到我們的實際操作:

1、編譯

在windows環境中,打開命令窗口,切換到java文件的目錄,使用 javac 命令,執行 javac xxx.java 把.java文件編譯成.class文件

2、裝載字節碼

編譯好的.class文件交給 JVM 執行,即使用java命令,執行java xxx(.class文件的名稱,不帶後綴)。java命令將會啟動 JVM,並將後面的參數作為初始化類,通過 JVM 內的類加載器將字節碼文件裝載到內存中。

3、校驗字節碼

類的加載是通過類加載器進行的,加載完後,先由字節碼校驗器負責檢查那些無法執行的明顯有破壞性的操作。除了系統類之外,其他類都要被校驗。

校驗器執行的一些檢查:

  • 變量要在使用前初始化
  • 方法調用與對象引用類型之間要匹配
  • 訪問私有數據和方法的規則沒有被違反
  • 對本地變量的訪問都在運行的堆棧內
  • 運行時堆棧沒有溢出

如果這些檢查沒有通過,類最終不會被加載完成。

4、解釋字節碼

JVM 把每一條要執行的字節碼交給解釋器,翻譯成對應的機器語言,最終由操作系統執行。

JVM解釋執行字節碼文件就是JVM操作Java解釋器進行解釋執行字節碼文件的過程。

維基百科

機器語言:機器語言(machine language)是一種指令集的體系。這種指令集稱為機器代碼(machine code),是計算機的CPU可直接解讀的數據。

結語

實際上JVM執行字節碼文件遠比這複雜,其中還包括即時編譯器、指令重排等優化。這裡只是對Java程序的執行過程做一個大致的介紹,讓Java程序員能夠明白自己寫的程序在JVM裡到底是如何執行的。如果要深入研究JVM的更多細節,建議大家去看書或其他資料。

本文引用於博客園,作者:為何不是夢

原文:https://www.cnblogs.com/ibigboy/p/11184133.html

"

相關推薦

推薦中...