<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類加載過程梳理,一篇搞定

          共 2097字,需瀏覽 5分鐘

           ·

          2021-12-05 08:33

          點擊關(guān)注公眾號,Java干貨及時送達(dá)??

          53a209d1aa9801e747885210fea19594.webp

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

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

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

          加載是“類加載”的第一個階段,就是將需要用到的類對應(yīng)的.class字節(jié)碼文件加載到虛擬機(jī)內(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方法的這個類加載到虛擬機(jī)內(nèi)存中開始執(zhí)行,當(dāng)執(zhí)行到User user = new User(),發(fā)現(xiàn)需要用到User類,就會將User.class加載到內(nèi)存中。所以簡單的說,當(dāng)需要用到哪個類時,就回去加載哪個類,Java的自帶的核心類會在虛擬機(jī)啟動時就會加載,包括包含main方法的啟動類。但其實,類加載也挺復(fù)雜的,只是我了解的也不深,目前就理解成這樣吧,后面再深入研究。

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

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

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

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

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

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

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

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

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

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

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

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

          a2e4e62e482c00a512b37029c3b7b561.webp圖片

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

          fc9b2c8c56702c42942d939c0e429cb6.webp

          JetBrains 推出“下一代 IDE”,快看看有哪些值得期待的功能!

          為什么不建議你使用實數(shù)作為 HashMap 的key?

          牛了!通過 Java 技術(shù)手段,獲取女朋友定位地址...

          20 個最常用的 Git 命令,你都會用嗎?

          新人問一般都用哪些 Linux 命令,我把這個扔了過去

          95后阿里p7曬出工資單:狠補(bǔ)了這個,真香...

          最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

          獲取方式:點“在看”,關(guān)注公眾號并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

          文章有幫助的話,在看,轉(zhuǎn)發(fā)吧。

          謝謝支持喲 (*

          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(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>
                  国产操b电影网站在线观看 | 枕瑶钗十三回兴云弄雨又春风 | 国产自研AV在线播放 | 亚洲中文在线字幕 | 日韩欧美中文在线无线码视频在线看免费版 |