準備階段正式為類變量分配內(nèi)存并設(shè)置初始值的階段這些變量所使用的內(nèi)存都在方法區(qū)進行分配。
目前
成都創(chuàng)新互聯(lián)已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、
網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、
呼倫貝爾網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
解析
解析階段是JVM將常量池內(nèi)的符號引用替換為直接引用的過程前面我們談到的編譯填充符號表的價值在這地方體現(xiàn)出來了。解析過程無非就是對類或接口、字段、接口方法進行解析。
初始化
類初始化階段是類加載過程的最后一步在準備階段變量已經(jīng)賦過一次初始值,而在這一步則會根據(jù)程序猿定制的要求進行初始化類變量和其他資源。
在這個階段就是執(zhí)行前面編譯字節(jié)碼生成流程提到的方法的過程。虛擬機也保證在多線程環(huán)境下這個方法被同時調(diào)用時被正確的加鎖、同步保證只有一個線程去執(zhí)行這個方法而其他線程阻塞等待。
這個位置還涉及到另一個我們比較關(guān)心的知識點Java何時觸發(fā)對類的初始化操作呢?
在遇到new、getstatic、putstatic或invokestatic這4條字節(jié)碼指令時如果類沒有初始化、則需要觸發(fā)其初始化。簡單理解就是new一個對象的時候讀取或者設(shè)置一個類的靜態(tài)字段的時候調(diào)用一個類的靜態(tài)方法的時候。使用java.lang.reflect包的方法對類進行反射調(diào)用的時候如果類沒有初始化則需要觸發(fā)其初始化。當初始化一個類發(fā)現(xiàn)其父類還沒進行初始化則先觸發(fā)其父類的初始化操作。當虛擬機啟動時用戶需要指定一個要執(zhí)行的主類虛擬會先初始化這個主類。當使用JDK1.7以上的動態(tài)語言支持時如果一個java.lang.invoke.MethodHandle實例最后的解析結(jié)果為REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄,并且這個方法句柄所對應(yīng)類沒有進行初始化則觸發(fā)初始化操作。
網(wǎng)頁題目:Java虛擬機--一段Java程序的生命史(五)
標題URL:
http://weahome.cn/article/cgcopo.html