回覆列表
-
1 # Java碼農之路
-
2 # Prinkle佐
從虛擬機器的視角來看,執行java程式碼首先需要將它編譯而成的class檔案載入到java虛擬機器中。載入後的java類會被存放在方法區中。實際執行時,虛擬機器會執行方法區的程式碼。
在執行過程中,每當呼叫進入一個java方法,java虛擬機器會在當前執行緒的java方法棧中生成一個棧幀,用以存放區域性變數以及位元組碼的運算元。這個棧幀的大小是提前計算好的,而且java虛擬機器不要求棧幀在記憶體空間裡連續分佈。
在hotspot裡面,上述翻譯過程有兩種形式:第一種是解釋執行,即逐條將位元組碼翻譯成機器碼並執行;第二種是即時編譯(JIT),即將一個方法包含的所有位元組碼編譯成機器碼後再執行。
一、Java程式碼執行流程
A、基本流程
一個Java專案,包含很多的「.java」為字尾的原始碼檔案,除去IDE裡直接執行除錯,一般來說,都是把程式碼打成jar包,或者是war包,最後將打包好的jar包或是war包傳到線上伺服器部署。
部署方式很多,最基本的一種是透過Tomcat容器來部署,也可以是自己手動透過java命令來執行一個jar包中的程式碼。
B、編譯
上述流程中有一個非常關鍵的點,「編譯」。
在java程式碼打包的過程中,一般會把原始碼編譯成「.class」字尾的位元組碼檔案。只有位元組碼檔案class才能被JVM識別並解釋執行。
C、JVM程序
對於編譯好的class位元組碼,需要使用諸如java -jar之類的命令來執行寫好的程式碼;一旦使用java命令,實際上此時就會啟動一個JVM程序。
JVM程序會負責執行這些class位元組碼檔案,也就相當於負責執行我們寫好的程式碼。
D、類載入
JVM要執行這些class位元組碼檔案中的程式碼,會採用類載入器把編譯好的class位元組碼檔案載入進JVM記憶體中
E、解釋執行
最後JVM會基於自己的位元組碼執行引擎,來執行載入到記憶體裡的類。當JVM需要哪個類時,會使用類載入器來載入對應的類。