Java運行原理

在研究Java運行原理之前,我們先把視野放寬一點:一般的高級語言是如何工作的?我們在編輯器或者IDE里根據每種語言的語法規則敲入源代碼,這些代碼我們很容易理解。很顯然,這些代碼肯定是以二進制存儲在我們的硬盤當中,當我們再次打開的時候,編輯器讀取這些二進制,還原成我們能讀懂的英文。當我們真正運行程序的時候,CPU是讀不懂這些英文的,所以我們需要先轉化成可執行的二進制文件,這個過程通常由編譯器完成。有些編譯器直接將源代碼編譯成機器碼,載入內存後CPU可以直接運行。而機器碼的格式是跟具體的CPU架構相關的,Intel的CPU機器碼對於ARM CPU來說是無法理解的。因此,同樣的源代碼需要根據不同的硬件進行特定的編譯。好了,高級語言到低級語言的橋樑就是編譯器。我們寫好源代碼,編譯器將源碼編譯成可執行的機器碼,然後CPU讀取機器碼,執行程序。可以說,Java這一語言的執行過程也遵循這樣的過程:源代碼--->機器碼。 但是,從源代碼到機器碼之間,究竟經過什麼樣的過程,則是Java獨一無二的了。寬泛地講,Java源代碼(.java)經過java編譯器(javac.exe)編譯之後,並沒有直接轉化爲機器碼,而是轉化成一種中間格式,成爲字節碼(.class),字節碼再經過java虛擬機轉化成特定CPU架構的機器碼。也正是因爲這一中間物,java纔有所謂的跨平臺。在windows平臺上編譯好的字節碼,copy到linux平臺後,經過爲linux而設計的Java虛擬機解釋後即可執行。跨平臺這一特徵,是通過字節碼和JVM來實現的。因此,想搞清楚java程序到底是如何運行的,重點在於弄明白字節碼是如何被轉化成跟CPU架構相關的機器碼然後被執行的。也就是要理解JVM到底是如何工作的。在瞭解JVM之前,我們再跳出來一下,先看看什麼是虛擬機。所謂虛擬機,我是這麼理解的:用軟件的方式模擬出跟硬件類似的環境,比如說寄存器、存儲器等等。當然,所有最終的工作還是由原來的CPU來完成。比如說VirtualBox這個虛擬機產品,它其實就是一個應用程序,用某種編程語言編寫的應用程序。當運行這個應用程序時,它會要求操作系統給它獨立施展手腳的空間:給我一些內存,給我一定的CPU時間片,然後不用管我了。你可能會問,寄存器是硬件啊,它怎麼能劃分啊,難道是時間劃分?不是的,像內存這樣的硬件,可以給虛擬機一塊獨立的內存塊,但是寄存器之後的,則需要用“模擬仿真”的方式來模擬。OK,回到Java虛擬機。到底什麼是Java虛擬機,很難有一個十分明確的定義,狹窄一點說,它就是一個應用程序,大部分用C++編寫的。寬泛地說,它就是執行字節碼的一整個環境。Java運行原理
從上面這一張圖可以看出來,JVM完成了字節碼帶機器碼的所有相關工作。它從文件系統中將字節碼文件載入到操作系統分配給Java虛擬機的內存當中,然後解釋字節碼,轉化成機器碼,然後經由操作系統到達CPU運行。整個執行過程如下圖所示:
Java運行原理
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章