新聞中心
這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Java虛擬機(jī)--一段Java程序的生命史(五)
準(zhǔn)備階段正式為類變量分配內(nèi)存并設(shè)置初始值的階段這些變量所使用的內(nèi)存都在方法區(qū)進(jìn)行分配。
解析
解析階段是JVM將常量池內(nèi)的符號(hào)引用替換為直接引用的過程前面我們談到的編譯填充符號(hào)表的價(jià)值在這地方體現(xiàn)出來了。解析過程無非就是對(duì)類或接口、字段、接口方法進(jìn)行解析。
初始化
類初始化階段是類加載過程的最后一步在準(zhǔn)備階段變量已經(jīng)賦過一次初始值,而在這一步則會(huì)根據(jù)程序猿定制的要求進(jìn)行初始化類變量和其他資源。
在這個(gè)階段就是執(zhí)行前面編譯字節(jié)碼生成流程提到的方法的過程。虛擬機(jī)也保證在多線程環(huán)境下這個(gè)方法被同時(shí)調(diào)用時(shí)被正確的加鎖、同步保證只有一個(gè)線程去執(zhí)行這個(gè)方法而其他線程阻塞等待。
這個(gè)位置還涉及到另一個(gè)我們比較關(guān)心的知識(shí)點(diǎn)Java何時(shí)觸發(fā)對(duì)類的初始化操作呢?
在遇到new、getstatic、putstatic或invokestatic這4條字節(jié)碼指令時(shí)如果類沒有初始化、則需要觸發(fā)其初始化。簡(jiǎn)單理解就是new一個(gè)對(duì)象的時(shí)候讀取或者設(shè)置一個(gè)類的靜態(tài)字段的時(shí)候調(diào)用一個(gè)類的靜態(tài)方法的時(shí)候。使用java.lang.reflect包的方法對(duì)類進(jìn)行反射調(diào)用的時(shí)候如果類沒有初始化則需要觸發(fā)其初始化。當(dāng)初始化一個(gè)類發(fā)現(xiàn)其父類還沒進(jìn)行初始化則先觸發(fā)其父類的初始化操作。當(dāng)虛擬機(jī)啟動(dòng)時(shí)用戶需要指定一個(gè)要執(zhí)行的主類虛擬會(huì)先初始化這個(gè)主類。當(dāng)使用JDK1.7以上的動(dòng)態(tài)語言支持時(shí)如果一個(gè)java.lang.invoke.MethodHandle實(shí)例最后的解析結(jié)果為REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且這個(gè)方法句柄所對(duì)應(yīng)類沒有進(jìn)行初始化則觸發(fā)初始化操作。
網(wǎng)站標(biāo)題:Java虛擬機(jī)--一段Java程序的生命史(五)
本文鏈接:http://ef60e0e.cn/article/cgcopo.html