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