<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Java類的生命周期淺析

          共 2393字,需瀏覽 5分鐘

           ·

          2021-08-06 06:10

          點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號”

          優(yōu)質(zhì)文章,第一時間送達(dá)

          知識前提

          在了解類的生命周期之前,有必要先了解一下jvm的內(nèi)存結(jié)構(gòu)。如下所示:

          在了解完jvm的內(nèi)存結(jié)構(gòu)之后,我們就知道了例如堆區(qū),棧區(qū),常量池和方法區(qū)等概念。

          也了解到了,我們編寫的代碼,是先需要通過編譯的,轉(zhuǎn)化成.class文件,才能夠被jvm所加載運(yùn)行的。那簡單來說,java類被jvm進(jìn)行加載到卸載的過程,就是java類的一生,我們稱之為java類的生命的周期


          類的生命周期

          一個類完整的生命周期,會經(jīng)歷五個階段,分別為:加載、連接、初始化、使用、和卸載。其中的連接又分為驗(yàn)證、準(zhǔn)備解析三個步驟。如下圖所示:

          也可能會存在加載或連接之后就直接別使用的情況,這里后續(xù)討論

          也可以說:Java類從被加載到虛擬機(jī)內(nèi)存中開始,到卸載出內(nèi)存為止,它的整個生命周期包括:加載(Loading)、驗(yàn)證(Verification)、準(zhǔn)備(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using) 和 卸載(Unloading)七個階段


          加載(Loading)

          簡單一句話概括,類的加載階段就是:找到需要加載的類并把類的信息加載到j(luò)vm的方法區(qū)中,然后在堆區(qū)中實(shí)例化一個java.lang.Class對象,作為方法區(qū)中這個類的信息的入口。結(jié)合jvm的內(nèi)存結(jié)構(gòu)會比較好理解。

          這里要區(qū)別一下接觸到的類加載。類加載其實(shí)包括加載、連接、初始化三個階段。類加載強(qiáng)調(diào)一個jvm能夠直接使用所需的類,所以類必須完成初始化。

          不同的虛擬機(jī)對類的加載時機(jī)有不同的實(shí)現(xiàn)方式,具體要看虛擬機(jī)的實(shí)現(xiàn)方式。這里不做展開。

          類的加載方式比較靈活,總結(jié)下來有如下幾種:

          1. 據(jù)類的全路徑名找到相應(yīng)的class文件,然后從class文件中讀取文件內(nèi)容;(常用)

          2. 從jar文件中讀取。另外,還有下面幾種方式也比較常用:(常用)

          3. 從網(wǎng)絡(luò)中獲?。罕热?0年前十分流行的Applet。

          4. 根據(jù)一定的規(guī)則實(shí)時生成,比如設(shè)計模式中的動態(tài)代理模式,就是根據(jù)相應(yīng)的類自動生成它的代理類。

          5. 從非class文件中獲取,其實(shí)這與直接從class文件中獲取的方式本質(zhì)


          連接(Linking)
          1. 驗(yàn)證:進(jìn)行類的合法性校驗(yàn)。會對比如字節(jié)碼格式、變量與方法的合法性、數(shù)據(jù)類型的有效性、繼承與實(shí)現(xiàn)的規(guī)范性等等進(jìn)行檢查,確保別加載的類能夠正常的被jvm所正常運(yùn)行。

          2. 準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存,并設(shè)為jvm默認(rèn)的初值;對于非靜態(tài)的變量,則不會為它們分配內(nèi)存。簡單說就是分內(nèi)存、賦初值。

            注意:設(shè)置初始值為jvm默認(rèn)初值,而不是程序設(shè)定。規(guī)則如下

            • 基本類型(int、long、short、char、byte、boolean、float、double)的默認(rèn)值為0

            • 引用類型的默認(rèn)值為null

            • 常量的默認(rèn)值為我們程序中設(shè)定的值,比如我們在程序中定義final static int a = 100,則準(zhǔn)備階段中a的初值就是100。

          3. 解析:這一階段的任務(wù)就是把常量池中的符號引用轉(zhuǎn)換為直接引用。


          初始化(Initialization)

          類初始化階段是類加載過程的最后一步。而也是到了該階段,才真正開始執(zhí)行類中定義的java程序代碼(字節(jié)碼),之前的動作都由虛擬機(jī)主導(dǎo)。

          jvm對類的加載時機(jī)沒有明確規(guī)范,但對類的初始化時機(jī)有:只有當(dāng)類被直接引用的時候,才會觸發(fā)類的初始化。類被直接引用的情況有以下幾種:

          1. 通過以下幾種方式:

            • new關(guān)鍵字創(chuàng)建對象

            • 讀取或設(shè)置類的靜態(tài)變量

            • 調(diào)用類的靜態(tài)方法

          2. 通過反射方式執(zhí)行1里面的三種方式;

          3. 初始化子類的時候,會觸發(fā)父類的初始化;

          4. 作為程序入口直接運(yùn)行時(調(diào)用main方法);

          5. 接口實(shí)現(xiàn)類初始化的時候,會觸發(fā)直接或間接實(shí)現(xiàn)的所有接口的初始化。

          關(guān)于類的初始化,記住兩句話

          1、類的初始化,會自上而下運(yùn)行靜態(tài)代碼塊或靜態(tài)賦值語句,非靜態(tài)與非賦值的靜態(tài)語句均不執(zhí)行。

          2、如果存在父類,則父類先進(jìn)行初始化,是一個典型的遞歸模型。

          區(qū)別于對象的初始化,類的初始化所做的一起都是基于類變量或類語句的,也就是說執(zhí)行的都是共性的抽象信息。而我們知道,類就是對象實(shí)例的抽象。


          使用(Using)

          類的使用分為直接引用間接引用

          直接引用與間接引用等判別條件,是看對該類的引用是否會引起類的初始化

          直接引用已經(jīng)在類的初始化中的有過闡述,不再贅述。而類的間接引用,主要有下面幾種情況:

          1. 當(dāng)引用了一個類的靜態(tài)變量,而該靜態(tài)變量繼承自父類的話,不引起初始化

          2. 定義一個類的數(shù)組,不會引起該類的初始化;

          3. 當(dāng)引用一個類的的常量時,不會引起該類的初始化


          卸載((Unloading)

          當(dāng)類使用完了之后,類就要進(jìn)入卸載階段了。那何為衡量類使用完的標(biāo)準(zhǔn)呢?

          1. 該類所有的實(shí)例都已經(jīng)被回收,也就是java堆中不存在該類的任何實(shí)例。

          2. 加載該類的ClassLoader已經(jīng)被回收。

          3. 該類對應(yīng)的java.lang.Class對象沒有任何地方被引用,無法在任何地方通過反射訪問該類的方法。

          如果以上三個條件全部滿足,jvm就會在方法區(qū)垃圾回收的時候?qū)︻愡M(jìn)行卸載,類的卸載過程其實(shí)就是在方法區(qū)中清空類信息,java類的整個生命周期就結(jié)束了。


            作者 |  acelin

          來源 |  cnblogs.com/acelin/p/15086383.html

          瀏覽 56
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人免费网站www污污污在线看 | 中国农村乱婬片AA片 | 青青草av | 99这里只有精品热 | 激情视频网站 |