日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java—JVM加载机制

發布時間:2023/12/18 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java—JVM加载机制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

編程語言有兩種:

1、編譯型語言? ? ? ? 將代碼一次性編譯成計算機可識別的二進制文件,語言有C和C++

2、解釋型語言? ? ? ? 通過解釋器,一行行讀取我們編寫的代碼轉換成二進制數據后執行,JVM就是解釋器,語言有java和kotlin lei

類加載器:

1.啟動類加載器(Bootstrap ClassLoader):加載JVM自身工作需要的類,它由JVM自己實現。它會加載JAVA_HOME/jre/lib下的文件。

2.擴展類加載器(Extension ClassLoader):負責加載JVM擴展類,jvm里面lib目錄中的ext中的jar包

3.應用程序類加載器(Application ClassLoader):根據ClassPath指定路徑,尋找應用程序所有加載class字節碼文件,從字節碼文件中加載類型對應的class對象,我們自己編寫的代碼以及使用的第三方的jar包都是由它來加載。

一個類,由不同的類加載器實例加載的話,會在方法區產生兩個不同的類,彼此不可見,并且在堆中生成不同Class實例。

雙親委托模型

如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器去執行。

如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終將到達頂層的啟動類加載器,如果父類加載器可以完成類加載任務,就成功返回,倘若父類加載器無法完成此加載任務,子加載器才會嘗試自己去加載,這就是雙親委派模式

優點:避免類的重復加載,避免了java的核心API被篡改。

類的生命周期:

一、類的加載

在加載的時候,虛擬機將我們寫的.java文件,編譯成字節碼后加載到內存里,然后在內存中生成一個java.lang.Class對象,作為方法區這個類的各種數據的訪問入口。

二、類的連接

類的加載過程后生成了類的java.lang.Class對象,接著會進入連接階段,連接階段負責將類的二進制數據合并入JRE(Java運行時環境)中。類的連接大致分三個階段。

1、驗證:驗證此class字節流是安全的、沒有被修改的、可以被正常使用的.

2、準備:為類的靜態變量(static)在方法區分配內存,并賦默認初值(0值或null值)。

? ? ? ? ? ? ? ? 如static int a = 5;? ? ?靜態變量a被賦默認值0。

? ? ? ? ? ? ? ??靜態常量(static final)會被賦程序設定的初值。

? ? ? ? ? ? ? ? 如static final int a = 5; ?靜態常量a就會在準備階段被直接賦值為5,而靜態變量是在初始化階段進行的。

? ? ? ? ? ? ? ? 對于一般的成員變量是在類實例化時候,隨對象一起分配在堆內存中。

3、解析:JVM將常量池中的符號引用轉換成直接引用的過程。

三、類的初始化

類初始化是類加載的最后一步,除了加載階段,用戶可以通過自定義的類加載器參與,其他階段都完全由虛擬機主導和控制。到了初始化階段才真正執行Java代碼。

類的初始化的主要工作是為靜態變量賦程序設定的初值。

如static int a = 100;在準備階段,a被賦默認值0,在初始化階段就j會被賦值為100。

java虛擬機規范中嚴格規定了有且只有五種情況必須對類進行初始化:

1、使用new字節碼指令創建類的實例,或者使用getstatic、putstatic讀取或設置一個靜態字段的值(放入常量池中的常量除外),或者調用一個靜態方法的時候,對應類必須進行過初始化。

2、通過java.lang.reflect包的方法對類進行反射調用的時候,如果類沒有進行過初始化,則要首先進行初始化。

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

4、當虛擬機啟動時,用戶需要指定一個主類(包含main()方法的類),虛擬機會首先初始化這個類。

5、使用jdk1.7的動態語言支持時,如果一個java.lang.invoke.MethodHandle實例最后的解析結果REF_getStatic、REF_putStatic、RE_invokeStatic的方法句柄,并且這個方法句柄對應的類沒有進行初始化,則需要先觸發其初始化。

總結

以上是生活随笔為你收集整理的Java—JVM加载机制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。