JVM類加載機制-創(chuàng)新互聯(lián)

目錄

成都創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比康巴什網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式康巴什網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋康巴什地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。

一、JVM類加載機制

一、類加載的過程

1.加載

2.鏈接

3.初始化

初始化順序

二、類加載時機

三、雙親委派機制

雙親委派機制優(yōu)勢


在這里插入圖片描述

一、JVM類加載機制

在這里插入圖片描述

一、類加載的過程

?當程序主動使用某個類時,如果該類還未被加載到內(nèi)存中,則JVM會通過加載、連接、初始化3個步驟來對該類進行初始化。

?在這個階段,JVM 的主要目的是將字節(jié)碼從各個位置(網(wǎng)絡(luò)、磁盤等)轉(zhuǎn)化為二進制字節(jié)流加載到內(nèi)存中,接著會為這個類在 JVM 的方法區(qū)創(chuàng)建一個對應(yīng)的 Class 對象,這個 Class 對象就是這個類各種數(shù)據(jù)的訪問入口。

1.加載
  1. 通過類全限定名獲取此類的二進制字節(jié)流。
  2. 將這個字節(jié)流所代表的靜態(tài)存儲結(jié)構(gòu)轉(zhuǎn)換為方法區(qū)的運行時數(shù)據(jù)結(jié)構(gòu)。
  3. 然后在堆區(qū)創(chuàng)建一個 java.lang.Class對象,用來封裝類在方法區(qū)內(nèi)的數(shù)據(jù)結(jié)構(gòu)
2.鏈接

就是將已經(jīng)讀入內(nèi)存的類的二進制數(shù)據(jù)合并到JVM運行時環(huán)境中去,包含以下步驟:

?驗證

檢驗被加載的類是否有正確的內(nèi)部結(jié)構(gòu),并和其他類協(xié)調(diào)一致。

準備

準備階段則負責(zé)為類的靜態(tài)屬性分配內(nèi)存,并設(shè)置java語言默認初始值;不包含final修飾的static實例變量,在編譯時進行初始化。不會為類成員變量初始化。

解析

將類的二進制數(shù)據(jù)中的符號引用替換成直接引用。

3.初始化

到了初始化階段,用戶定義的 Java 程序代碼才真正開始執(zhí)行。在這個階段,JVM 會根據(jù)語句執(zhí)行順序?qū)︻悓ο筮M行初始化。

準備階段和初始化階段看似有點矛盾,其實是不矛盾的,如果類中有語句:private static int a = 10,它的執(zhí)行過程是這樣的,首先字節(jié)碼文件被加載到內(nèi)存后,先進行鏈接的驗證這一步驟,驗證通過后準備階段,給a分配內(nèi)存,因為變量a是static的,所以此時a等于int類型的默認初始值0,即a=0,然后到解析(后面在說),到初始化這一步驟時,才把a的真正的值10賦給a,此時a=10。

?注意:對于一個final類型的靜態(tài)變量,如果該變量的值在編譯時就可以確定下來,那么這個變量相當于“宏變量”。Java編譯器會在編譯時直接把這個變量出現(xiàn)的地方替換成它的值,因此即使程序使用該靜態(tài)變量,也不會導(dǎo)致該類的初始化。反之,如果final類型的靜態(tài)Field的值不能在編譯時確定下來,則必須等到運行時才可以確定該變量的值,如果通過該類來訪問它的靜態(tài)變量,則會導(dǎo)致該類被初始化。

初始化順序

在這里插入圖片描述

二、類加載時機

? 1. 創(chuàng)建類的實例,也就是new一個對象
? 2. 訪問某個類或接口的靜態(tài)變量,或者對該靜態(tài)變量賦值
? 3. 調(diào)用類的靜態(tài)方法
? 4. 反射(Class.forName("com.lyj.load"))
? 5. 初始化一個類的子類(會首先初始化子類的父類)
? 6. 用戶指定一個要執(zhí)行的主類(包含main()方法的那個類),虛擬機會先初始化這個主類 ??

三、雙親委派機制

?如果一個類加載器收到了類加載請求,它并不會自己先去加載,而是把這個請求委托給父類的加載器執(zhí)行,如果父類加載器還存在其父類加載器,則進一步向上委托,依次遞歸,請求最終將到達頂層的啟動類加載器,若父加載器無法完成此加載任務(wù),子加載器才會嘗試自己去加載,直至記載完成。

在這里插入圖片描述

雙親委派機制優(yōu)勢

? 1.避免類的重復(fù)加載
? 2.當自己程序中定義了一個和Java.lang包同名的類,此時,由于使用的是雙親委派機制,會由啟動類加載器去加載JAVA_HOME/lib中的類,而不是加載用戶自定義的類。此時,程序可以正常編譯,但是自己定義的類無法被加載運行。

3.保護程序安全,防止核心API被隨意篡改

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁名稱:JVM類加載機制-創(chuàng)新互聯(lián)
地址分享:http://muchs.cn/article16/coegdg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計、軟件開發(fā)、做網(wǎng)站網(wǎng)站設(shè)計公司、商城網(wǎng)站、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名