說明:本文主要參考自《分布式Java應用:基礎與實踐》
1、Java代碼執行流程

- 第一步:*.java-->*.class(編譯期)
- 第二步:從*.class文件將其中的內容加載到內存(類加載)(運行期)
- 第三步:執行代碼(運行期)
說明:
- 整個白框部分表示JVM管理的內存
- 包含棧幀的地方稱作JVM方法棧,一個棧幀就是一個方法
- 在Hotspot JVM中,JVM方法棧和本地方法棧是同一個
- java方法是通過出棧操作來執行的(在類加載后入棧),所以執行引擎直接操作的是棧幀(即一個方法)
- 具體的JVM內存結構,查看第一章 JVM內存結構
2、代碼編譯
javac命令將源碼文件編譯為*.class文件。
后邊將介紹:
- javac將*.java編譯成*.class文件的過程
- class文件的文件格式,以及其存儲的內容
3、類加載
主要是指將*.class文件加載到JVM,並形成Class對象的機制,之后就可以對Class對象實例化並調用了。
特點:
- 類加載機制可以在運行時動態加載外部類
后邊將介紹:
- 類加載的過程
- 類加載的雙親委托機制
- 類加載器的層次關系及源碼
4、執行代碼
兩種執行方式:
- 解釋執行(運行期解釋字節碼並執行)
- 速度慢,效率低
- 但是要比編譯為機器碼執行省內存
- 編譯為機器碼執行(將字節碼編譯為機器碼並執行,這個編譯過程發生在運行期,稱為JIT編譯),下面是兩種模式
- client(即C1):只做少量性能開銷比高的優化,占用內存少,適用於桌面程序。
- server(即C2):進行了大量優化,占用內存多,適用於服務端程序。會收集大量的運行時信息。
注意:
- 32為機器默認選擇C1,可在啟動時添加-client或-server來指定,64位機器若CPU>2且物理內存>2G則默認為C2,否則為C1
- Sun JDK執行代碼的機制:對在執行過程中執行頻率高的代碼進行編譯,對執行頻率不高的代碼繼續解釋執行
后邊將介紹:
- Sun JDK執行代碼的過程
- C1以及C2執行的一些優化
- 編譯執行與解釋執行的使用的衡量點
