說明:本文主要參考自《分散式Java應用:基礎與實踐》 1、Java代碼執行流程 第一步:*.java-->*.class(編譯期) 第二步:從*.class文件將其中的內容載入到記憶體(類載入)(運行期) 第三步:執行代碼(運行期) 2、代碼編譯 javac命令將源碼文件編譯為*.class文件。
說明:本文主要參考自《分散式Java應用:基礎與實踐》
1、Java代碼執行流程
- 第一步:*.java-->*.class(編譯期)
- 第二步:從*.class文件將其中的內容載入到記憶體(類載入)(運行期)
- 第三步:執行代碼(運行期)
2、代碼編譯
javac命令將源碼文件編譯為*.class文件。
後邊將介紹:
- javac將*.java編譯成*.class文件的過程
- class文件的文件格式,以及其存儲的內容
3、類載入
主要是指將*.class文件載入到JVM,並形成Class對象的機制,之後就可以對Class對象實例化並調用了。
特點:
- 類載入機制可以在運行時動態載入外部類
後邊將介紹:
- 類載入的過程
- 類載入的雙親委托機制
- 類載入器的層次關係及源碼
4、執行代碼
兩種執行方式:
- 解釋執行(運行期解釋位元組碼並執行)
- 速度慢,效率低
- 但是要比編譯為機器碼執行省記憶體
- 編譯為機器碼執行(將位元組碼編譯為機器碼並執行,這個編譯過程發生在運行期,稱為JIT編譯),下麵是兩種模式
- client(即C1):只做少量性能開銷比高的優化,占用記憶體少,適用於桌面程式,主要的優化包括:
- 方法內聯
- 去虛擬化
- 冗餘消除
- server(即C2):進行了大量優化,占用記憶體多,適用於服務端程式。會收集大量的運行時信息。
- 逃逸分析:根據運行狀況來判斷方法中的變數是否會被外部讀取,若不會,此變數是逃逸的。基於此,C2在編譯時會做:
- 標量替換
- 棧上分配
- 同步削除
- 逃逸分析:根據運行狀況來判斷方法中的變數是否會被外部讀取,若不會,此變數是逃逸的。基於此,C2在編譯時會做:
- 32為機器預設選擇C1,可在啟動時添加-client或-server來指定,64位機器若CPU>2且物理記憶體>2G則預設為C2,否則為C1
- client(即C1):只做少量性能開銷比高的優化,占用記憶體少,適用於桌面程式,主要的優化包括:
- Sun JDK執行代碼的機制:對在執行過程中執行頻率高的代碼進行編譯,對執行頻率不高的代碼繼續解釋執行
後邊將介紹:
- Sun JDK執行代碼的過程
- C1以及C2執行的一些優化
- 編譯執行與解釋執行的使用的衡量點