成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

面試guan:Java 類加載過程是怎么樣的?又被問麻了。。

來源:blog.csdn.net/hsz2568952354/article/details/96763284

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:空間域名、網(wǎng)頁空間、營銷軟件、網(wǎng)站建設、彭澤網(wǎng)站維護、網(wǎng)站推廣。

最近在看Java虛擬機,正好看到類加載這塊,所以簡單記錄下所學到的知識,作為筆記。

首先,我們編寫好的Java代碼,經(jīng)過編譯變成.class文件,然后類加載器把.class字節(jié)碼文件加載到JVM中,接著執(zhí)行我們的代碼,最后將類卸載出JVM。而從類加載到虛擬機到卸載出虛擬機的這一整個生命周期總共可以分為7個步驟,分別為加載、驗證、準備、解析、初始化、使用和卸載,其中驗證、準備和解析又稱為連接階段。接下來簡單介紹下各個階段是干嘛的。

加載是“類加載”的第一個階段,就是將需要用到的類對應的.class字節(jié)碼文件加載到虛擬機內(nèi)存,并在方法區(qū)中生成一個java.lang.Class對象,作為程序訪問這個類的各種數(shù)據(jù)的訪問入口。

public class Test {
    public static void main(String[] args) {
        User user = new User();
    }
}

看一下上面這段代碼,經(jīng)過編譯會生成兩個字節(jié)碼文件Test.classUser.class,接著會將包含main方法的這個類加載到虛擬機內(nèi)存中開始執(zhí)行,當執(zhí)行到User user = new User(),發(fā)現(xiàn)需要用到User類,就會將User.class加載到內(nèi)存中。所以簡單的說,當需要用到哪個類時,就回去加載哪個類,Java的自帶的核心類會在虛擬機啟動時就會加載,包括包含main方法的啟動類。但其實,類加載也挺復雜的,只是我了解的也不深,目前就理解成這樣吧,后面再深入研究。

第二階段驗證,從字面上就可以看出這個階段是來校驗加載進來的.class文件中的內(nèi)容是否符合規(guī)范,畢竟編譯成.class文件后還是可以人為的對這個文件進行修改,那如果改的亂七八糟,壓根不符合虛擬機的規(guī)范,那虛擬機就沒法執(zhí)行了,所以說這一步還是比較關鍵的。至于如何驗證,還沒有研究。

準備階段我引用《深入理解Java虛擬機》中的一句話:準備階段是正式為類變量分配內(nèi)存并設置類變量初始值的階段,這些變量所使用的內(nèi)存都將在方法區(qū)中進行分配。這也比較好理解,看下面一段代碼:

public class Test {
    public static int value = 10;
}

當需要用到這個類時,會先將這個類加載到內(nèi)存中,并驗證字節(jié)碼文件的合法性。驗證通過后就會進行準備工作了,會為這個類中的類變量分配內(nèi)存空間,就是上面的value變量,并給一個初始值。

注意,僅包括類變量,不包括實例變量和局部變量等,并且只是給一個初始值,int型的初始值是0,所以準備過后,value的值是0,而不是10,而真正賦值為10是在初始化階段。我還在其它資料上看到,這一階段也會給這個類分配內(nèi)存空間,先給類分配內(nèi)存,在給它里面的類變量分配內(nèi)存。

解析階段是將常量池中的符號引用替換為直接引用的過程,這一部分內(nèi)容我還沒搞懂,所以這里就不過多記錄了,簡單了解一下。

初始化階段是類加載中核心的一步了,還是以上面的代碼為例,準備階段我們已經(jīng)為value變量分配了內(nèi)存空間并給了初始值,現(xiàn)在就是真正給value賦值的時候,把10賦給了value。如果類中還含有靜態(tài)代碼塊,也會在這一階段執(zhí)行。這里還要一點要注意,初始化類的時候,如果父類還沒加載和初始化,也會觸發(fā)父類的加載和初始化。

使用就沒什么好說了,初始化完就可以開始使用這個對象了。

卸載是類的生命周期中的最后一階段,即將方法區(qū)中無用的類回收,而類需要同時滿足下面3個條件才算無用的類:

  • 該類所有的實例都已經(jīng)被回收,也就是Java堆中不存在該類的任何實例。
  • 加載該類的ClassLoader已經(jīng)被回收。
  • 該類對應的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

同時滿足上述3個條件的類即可回收,但不一定就會回收,可通過參數(shù)配置。

下面用一張圖來簡單展示類的加載流程:

以上就是Java類的加載過程,當然,只是簡單的說明了一下,剛接觸,還是有很多地方不清楚,先大概有一個這樣的印象,后面再慢慢深入理解。

參考資料:

  • 《深入理解Java虛擬機》
  • 《從0開始帶你成為JVM實戰(zhàn)高手》

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協(xié)程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優(yōu)雅的方式??!

5.《Java開發(fā)手冊(嵩山版)》最新發(fā)布,速速下載!

覺得不錯,別忘了隨手點贊+轉(zhuǎn)發(fā)哦!

分享文章:面試guan:Java 類加載過程是怎么樣的?又被問麻了。。
文章位置:http://jinyejixie.com/article22/dsdihjc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、品牌網(wǎng)站設計、云服務器、網(wǎng)站營銷、網(wǎng)站導航、手機網(wǎng)站建設

廣告

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

外貿(mào)網(wǎng)站制作
孝感市| 宿迁市| 临夏县| 葫芦岛市| 盐亭县| 江安县| 甘孜县| 蓝山县| 驻马店市| 盐津县| 大悟县| 墨玉县| 资兴市| 淳化县| 泰安市| 虎林市| 宁陵县| 农安县| 南安市| 琼海市| 彭阳县| 林西县| 额济纳旗| 渑池县| 钦州市| 仁怀市| 甘泉县| 乌恰县| 二手房| 留坝县| 岑巩县| 广水市| 莱芜市| 淮安市| 旌德县| 山东| 新竹市| 元朗区| 万源市| 莱西市| 读书|