今天咱們來聊聊jvm的運行機制,從而瞭解java程序的運行原理。做爲一個高級java程序員,不只要會編碼,並且還要明白本身的程序是如何運行的,這樣咱們就能在後續的程序調優方面駕輕就熟。接下來從如下幾個方面來了解JVM的運行原理。java
1.Java程序編譯過程程序員
Java程序的編譯過程簡單來講就是java源程序(.java文件)到Jvm字節碼(.class文件)的過程,主要由Java編譯器來完成。在編譯一個java類程序以前先編譯所依賴的全部類。jvm
編譯的過程大體分爲三個過程優化
(編譯命令:javac hello.java)編碼
1) 詞法分析和輸入符號表操作系統
2) 註解處理線程
3) 語義分析和生成字節碼翻譯
詳細過程:設計
源代碼文件*.java -> 詞法分析器 -> tokens流 -> 語法分析器 -> 語法樹/抽象語法樹 -> 語義分析器 -> 註解抽象語法樹 -> 字節碼生成器 -> JVM字節碼文件*.class指針
編譯後的Class文件主要包含三項內容
(查看class文件結構命令:javap –c hello)
1) 結構信息:class文件相關信息
2) 元信息:源碼中的聲明和常量信息
3) 方法信息:源碼中的語句和表達式對應的字節碼
2.Java程序加載過程
Java程序的加載過程就是.class被加載到jvm內存中的過程,主要由類加載器ClassLoader完成。
類加載器的分類主要分爲四類,分別加載不一樣的路徑:
JVM對類的加載過程分爲三步:
1) 裝載:負責將二進制文件加載到Jvm內存中。
2) 連接:負責二進制文件格式校驗,初始化裝載類中的靜態變量以及解析類中調用的接口和類。
3) 初始化:靜態初始化代碼,構造器、靜態屬性初始化以及jvm指定的初始化代碼。
3.Java程序執行過程
完成各類初始化工做以後,而後交由jvm執行引擎來進行處理,執行引擎把字節碼轉爲機器碼,而後操做系統才能夠真正調用,在硬件環境上執行代碼。執行引擎的經過Java字節碼解釋器(一行一行解釋字節碼)和JIT即時編譯器(對熱代碼整段編譯)來完成機器碼的翻譯工做。
4.JVM啓動流程
Jvm執行一個main方法前都要進行哪些準備工做。主要步驟有:
1) 配置JVM裝載環境:JVM.dll文件的查找和裝載
2) 解析虛擬機參數:解析參數,驗證參數
3) 設置線程棧大小:根據系統類型,加載配置文件,不一樣系統,線程棧的大小都不一樣
4) 執行Java main方法
5.JVM基本結構
接下來分別介紹以上幾個重要的內容
PC寄存器:每一個線程都會擁有一個PC寄存器,隨線程的建立而建立,PC寄存器的做用就是執行下一條指令執行的地址。在執行本地方法時,PC寄存器的值爲undefined。
方法區:保存類裝載的信息(類型的常量信息,方法信息,方法字節碼),方法區一般和永久區聯繫在一塊兒。
Java堆:這是和咱們程序員密切相關的一部分,new出來的每一個對象都在堆中,java堆也是線程共享的。
Java棧:棧由一系列的幀組成,所以也稱棧幀,它是線程私有的。幀保存一個方法的局部變量,操做數棧,常量池指針,每一次的方法調用都會建立一個幀,而後壓棧。
6.JVM內存模型
JVM的內存模型設計也是很是的巧妙。每個線程都會有一個工做內存和主存獨立,而每一個工做內存中的存放的是主存中共享變量的拷貝。
對於JVM的瞭解,做爲一個優秀程序員是必修課,由於只有瞭解了java程序內部的運行原理,纔可以更好的理解本身所寫的程序,也可以更好的優化本身的程序。正所謂:知己知彼,百戰不殆。