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


Java對(duì)象的創(chuàng)建

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

class文件載入過(guò)程

加載

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

  • 通過(guò)一個(gè)類的全限定名來(lái)獲取其定義的二進(jìn)制字節(jié)流。

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

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

網(wǎng)友評(píng)論