2012軟考軟件設(shè)計(jì)師輔導(dǎo):Java虛擬機(jī)類加載機(jī)制

字號(hào):

軟件設(shè)計(jì)師Java虛擬機(jī)類加載機(jī)制,個(gè)人覺得要弄清楚,可以從如下兩個(gè)方面去了解:
    1.什么是類加載機(jī)制及虛擬機(jī)加載類的時(shí)機(jī)。
    2.加載過程。
    首先看看第一個(gè):虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制。
    由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類型),所以java的類加載過程都是在程序運(yùn)行期完成。
    2.虛擬機(jī)整個(gè)的加載過程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
    1.加載,這個(gè)過程虛擬機(jī)并沒有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
    1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類的靜態(tài)字段(final靜態(tài)字段除外),以及調(diào)用類的靜態(tài)方法的時(shí)候。
    2)使用reflect包的方法進(jìn)行類的反射調(diào)用的時(shí)候。
    3)當(dāng)初始化一個(gè)類的時(shí)候,如果他的父類沒有初始化,則先要觸發(fā)父類的初始化。(注意這里是父類,如果是父接口的話,是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類有引用父接口的變量)
    4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶指定的一個(gè)要執(zhí)行的主類(包含main方法的)
    注:以上稱為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類的加載和初始化的。如:通過子類引用父類的靜態(tài)字段,不會(huì)觸發(fā)子類初始化;通過數(shù)組定義來引用類,不會(huì)觸發(fā)此類的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類的初始化。
    在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來看看加載過程主要做些什么:
    1通過類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。這個(gè)過程涉及到類加載器的過程,將在后面具體在寫。
    2將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
    3在java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問入口。
    第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。
    軟件設(shè)計(jì)師Java虛擬機(jī)類加載機(jī)制,個(gè)人覺得要弄清楚,可以從如下兩個(gè)方面去了解:
    1.什么是類加載機(jī)制及虛擬機(jī)加載類的時(shí)機(jī)。
    2.加載過程。
    首先看看第一個(gè):虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java類型,這就是虛擬機(jī)的類加載機(jī)制。
    由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類型),所以java的類加載過程都是在程序運(yùn)行期完成。
    2.虛擬機(jī)整個(gè)的加載過程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
    1.加載,這個(gè)過程虛擬機(jī)并沒有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
    1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類的靜態(tài)字段(final靜態(tài)字段除外),以及調(diào)用類的靜態(tài)方法的時(shí)候。
    2)使用reflect包的方法進(jìn)行類的反射調(diào)用的時(shí)候。
    3)當(dāng)初始化一個(gè)類的時(shí)候,如果他的父類沒有初始化,則先要觸發(fā)父類的初始化。(注意這里是父類,如果是父接口的話,是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類有引用父接口的變量)
    4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶指定的一個(gè)要執(zhí)行的主類(包含main方法的)
    注:以上稱為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類的加載和初始化的。如:通過子類引用父類的靜態(tài)字段,不會(huì)觸發(fā)子類初始化;通過數(shù)組定義來引用類,不會(huì)觸發(fā)此類的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類的初始化。
    在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來看看加載過程主要做些什么:
    1通過類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。這個(gè)過程涉及到類加載器的過程,將在后面具體在寫。
    2將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
    3在java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問入口。
    第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。
    軟件設(shè)計(jì)師Java 虛擬機(jī)類加載機(jī)制,個(gè)人覺得要弄清楚,可以從如下兩個(gè)方面去了解:
    1.什么是類加載機(jī)制及虛擬機(jī)加載類的時(shí)機(jī)。
    2.加載過程。
    首先看看第一個(gè):虛擬機(jī)把描述類的數(shù)據(jù)從class文件加載到內(nèi)存,并對(duì)class文件的合法性進(jìn)行驗(yàn)證,引用轉(zhuǎn)換及解析,最終形成可以被虛擬機(jī)使用的Java 類型,這就是虛擬機(jī)的類加載機(jī)制。
    由于java的動(dòng)態(tài)擴(kuò)展特點(diǎn)(就是可以在運(yùn)行期指定具體類型),所以java的類加載過程都是在程序運(yùn)行期完成。
    2.虛擬機(jī)整個(gè)的加載過程可以分為7個(gè)階段:加載-》驗(yàn)證-》準(zhǔn)備-》解析-》初始化-》使用-》卸載。
    1.加載,這個(gè)過程虛擬機(jī)并沒有明確規(guī)定何時(shí)進(jìn)行,但是規(guī)定了只有以下四種情況必須立即進(jìn)行加載。
    1)遇到new,getstatic,putstatic,invokestatic四條指令的時(shí)候,對(duì)應(yīng)的場(chǎng)景:使用new關(guān)鍵字,讀取或設(shè)置一個(gè)類的靜態(tài)字段(final 靜態(tài)字段除外),以及調(diào)用類的靜態(tài)方法的時(shí)候。
    2)使用reflect包的方法進(jìn)行類的反射調(diào)用的時(shí)候。
    3)當(dāng)初始化一個(gè)類的時(shí)候,如果他的父類沒有初始化,則先要觸發(fā)父類的初始化。(注意這里是父類,如果是父接口的話,是不會(huì)觸發(fā)父接口初始化成員變量的操作的,除非子類有引用父接口的變量)
    4)虛擬機(jī)啟動(dòng)時(shí),虛擬機(jī)會(huì)首先加載用戶指定的一個(gè)要執(zhí)行的主類(包含main方法的)
    注:以上稱為主動(dòng)引用。有些情況是不會(huì)觸發(fā)類的加載和初始化的。如:通過子類引用父類的靜態(tài)字段,不會(huì)觸發(fā)子類初始化;通過數(shù)組定義來引用類,不會(huì)觸發(fā)此類的初始化;調(diào)用常量不會(huì)觸發(fā)定義常量的類的初始化。
    在確定了什么時(shí)候會(huì)觸發(fā)加載操作后,再來看看加載過程主要做些什么:
    1通過類的全限定名來獲取定義此類的二進(jìn)制字節(jié)流。這個(gè)過程涉及到類加載器的過程,將在后面具體在寫。
    2 將這個(gè)字節(jié)流所代表的靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)中的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu)。方法區(qū)的數(shù)據(jù)結(jié)構(gòu)每個(gè)虛擬機(jī)實(shí)現(xiàn)都可以不一樣。
    3 在java堆中生成一個(gè)代表這個(gè)類的java.lang.Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的外部訪問入口。
    第一步到此就完成了。后面會(huì)繼續(xù)介紹第二階段驗(yàn)證。