JVM底層原理解析,在這個開源項目里講透了
JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設備的規范,它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。
Java程序員們都知道,JVM 是咱們成為大神必須要跨過的一道坎,今天猿妹在Github周榜上發現了一個非常干的JVM開源項目——jvm,這個項目里面記錄一些創建者認為需要重點掌握的JVM知識點,通過這個項目學習后,如果你想更加全面地了解 JVM 底層原理,可以閱讀周志明老師《深入理解 Java 虛擬機——JVM 高級特性與最佳實踐(第 2/3 版)》全書。
這個項目主要內容如下:
整個項目內容還是相對完整的,下面一起來看看【JVM內存結構】部分內容:
Java 虛擬機的內存空間分為 5 個部分:
- 程序計數器
- Java 虛擬機棧
- 本地方法棧
- 堆
- 方法區
JDK 1.8 同 JDK 1.7 比,最大的差別就是:元數據區取代了永久代。元空間的本質和永久代類似,都是對 JVM 規范中方法區的實現。不過元空間與永久代之間最大的區別在于:元數據空間并不在虛擬機中,而是使用本地內存。
Java 虛擬機棧的定義
Java 虛擬機棧是描述 Java 方法運行過程的內存模型。Java 虛擬機棧會為每一個即將運行的 Java 方法創建一塊叫做“棧幀”的區域,用于存放該方法運行過程中的一些信息,如:
- 局部變量表
- 操作數棧
- 動態鏈接
- 方法出口信息
壓棧出棧過程
當方法運行過程中需要創建局部變量時,就將局部變量的值存入棧幀中的局部變量表中。
Java 虛擬機棧的棧頂的棧幀是當前正在執行的活動棧,也就是當前正在執行的方法,PC 寄存器也會指向這個地址。只有這個活動的棧幀的本地變量可以被操作數棧使用,當在這個棧幀中調用另一個方法,與之對應的棧幀又會被創建,新創建的棧幀壓入棧頂,變為當前的活動棧幀。
方法結束后,當前棧幀被移出,棧幀的返回值變成新的活動棧幀中操作數棧的一個操作數。如果沒有返回值,那么新的活動棧幀中操作數棧的操作數沒有變化。
目前,jvm已經在Github上標星6.1K,累計分支1.5K(Github地址:https://github.com/doocs/jvm)