如題,本文的宗旨既是透過對象的生命周期,來梳理JVM內(nèi)存結(jié)構(gòu)及GC相關(guān)知識,并輔以AOP及雙親委派機制原理,學(xué)習(xí)不僅僅是海綿式的吸收學(xué)習(xí),還需要自己去分析why,加深對技術(shù)的理解和認知,祝大家早日走上自己的“成金之路”。


Java對象的創(chuàng)建

本部分,從攻城獅編寫.java文件入手,詳解了編譯、載入、AOP原理。
讀過《程序員的自我修養(yǎng)》的朋友,對程序的編譯及執(zhí)行會有一個很清晰的認識:編譯其實就是將人類能理解的代碼文件轉(zhuǎn)譯為機器/CPU能執(zhí)行的文件(包括數(shù)據(jù)段、代碼段),而執(zhí)行的過程,則是根據(jù)文件頭部字節(jié)的標(biāo)識(簡稱魔數(shù)),映射為對應(yīng)的文件結(jié)構(gòu)體,找到程序入口,當(dāng)獲取到CPU執(zhí)行權(quán)限時,將方法壓棧,執(zhí)行對應(yīng)的指令碼,完成相應(yīng)的邏輯操作。
而對應(yīng).java文件,則先需要使用javac進行編譯,編譯后的.class文件,此文件將java程序能讀懂的數(shù)據(jù)段和代碼段,之后用java執(zhí)行文件,既是載入.class文件,找到程序入口,并根據(jù)要執(zhí)行的方法,不停的壓棧、出棧,進行邏輯處理。

class文件載入過程

加載

在加載階段,虛擬機需要完成以下三件事情:

  • 通過一個類的全限定名來獲取其定義的二進制字節(jié)流。

  • 將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)。

  • 在Java堆中生成一個代表這個類的java.lang.Class對象,作為對方法區(qū)中這些數(shù)據(jù)的訪問入口。

網(wǎng)友評論