JVM類加載機制

    虛擬機把描述類的數據從Class文件加載到內存,並對數據進行校驗、轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。

        與哪些在編譯時需要進行連接工作的語言不同,在Java語言裏面,類型的加載和連接過程都是在程序運行期間完成的,這樣會在類加載時稍微增加一下性能開銷,但是卻能爲Java應用程序提供高度的靈活性,Java中天生可以動態擴展的語言特性就是依賴運行期動態和動態連接這個特點實現的。例如,如果編寫一個使用接口的應用程序,可以等到運行時再指定其實際的實現。這種組裝應用程序的方式廣泛應用於Java程序之中。

        在實際情況中,每個Class文件都有可能代表着Java語言中的一個類或接口,而對於類和接口需要分開描述的場景會特別指明,Class文件並非指Class必須存在於具體磁盤中的某個文件,這裏說的Class文件指的是一串二進制的字節流,無論以何種形式存在都可以。

        與哪些在編譯時需要進行連接工作的語言不同,在Java語言裏面,類型的加載和連接過程都是在程序運行期間完成的,這樣會在類加載時稍微增加一下性能開銷,但是卻能爲Java應用程序提供高度的靈活性,Java中天生可以動態擴展的語言特性就是依賴運行期動態和動態連接這個特點實現的。例如,如果編寫一個使用接口的應用程序,可以等到運行時再指定其實際的實現。這種組裝應用程序的方式廣泛應用於Java程序之中。

       類從被加載到虛擬機內存中開始,到卸載出內存爲止,它都生命週期包括來:加載、驗證、準備、解析、初始化、使用和卸載七個階段。其中驗證、準備和解析三個部分統稱爲連接。這七個階段的發生順序如圖所示。

                   JVM類加載機制

       加載、驗證、準備、初始化和卸載這五個階段的順序是確定的,類的加載過程必須按照這種順序按部就班地開始,而解析階段則不一定:它在某些情況下可以在初始化階段之後再開始,這是爲了支持Java語言的運行時綁定稱爲動態綁定。這裏說的“開始”而不是按部就班的“進行”或“完成”,因爲這些階段通常都是互相交叉地混合式進行的,通常會在一個階段執行的過程中調用或激活另一個階段。

       什麼情況下需要開始類加載過程的第一個階段:加載。虛擬機規範中並沒有進行強制約束,這點可以交給虛擬機的具體實現來自由把握。對於初始化階段,虛擬機規範則是嚴格規定了有且只有四種情況必須立即對類進行初始化。

       1)遇到new、getstatic、putstatic或invokestatic這4條字節碼字節碼指令時,如果類沒有進行過初始化,則需要先觸發其初始化。

       2)使用java.lang.reflect包中的方法對類進行反射調用時,如果類沒有進行過初始化,則需要先觸發其初始化。

       3)當初始化一個類的時候,如果發現其父類還沒有進行過初始化,則需要先觸發其父類的初始化。

       4)虛擬機啓動時,用戶需要指定一個要執行的主類,虛擬機會初始化這個主類。 


作者:柯之夢
來源:CSDN
原文:https://blog.csdn.net/yin4302008/article/details/86567393
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章