一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 從JVM分析Java的類的加載和卸載機制

從JVM分析Java的類的加載和卸載機制

2020-01-15 14:13圣騎士Wind的博客 JAVA教程

這篇文章主要介紹了從JVM分析Java的類的加載和卸載機制,講解了Java類的聲明周期,需要的朋友可以參考下

從JVM分析Java的類的加載和卸載機制

 

類的加載
  類的加載指的是將類的.class文件中的二進制數據讀入到內存中,將其放在運行時數據區的方法區內,然后在堆區創建一個java.lang.Class對象,用來封裝類在方法區內的數據結構。

  加載.class文件的方式:

  1.從本地系統中直接加載

  2.通過網絡下載.class文件

  3.從zip,jar等歸檔文件中加載.class文件

  4.從專有數據庫中提取.class文件

  5.將Java源文件動態編譯為.class文件

  類的加載的最終產品是位于堆區中的Class對象。

  Class對象封裝了類在方法區內的數據結構,并且向Java程序員提供了訪問方法區內的數據結構的接口。

從JVM分析Java的類的加載和卸載機制

類加載器
  加載器有兩種類型:

  1.Java虛擬器自帶的加載器

        根類加載器(Bootstrap)

        擴展類加載器(Extension)

        系統類加載器或稱應用加載器(System)

  后兩種加載器是Java實現的,根類加載器是C++寫的,程序員無法在Java代碼中獲得該類。

  2.用戶自定義的類加載器

        java.lang.ClassLoader的子類

        用戶可以定制類的加載方式 

  類加載器并不需要等到某個類被首次主動使用時再加載它。

  JVM規范允許類加載器在預料某個類將要被使用時就預先加載它,如果在預先加載的過程中遇到了.class文件缺失或存在錯誤,類加載器必須在程序首次主動使用該類時才報告錯誤(LinkageError)。如果這個類一直沒有被程序主動使用,那么類加載器就不會報告錯誤。

類的卸載機制
類的生命周期
  當Sample類被加載、連接和初始化后,它的生命周期就開始了。

  當代表Sample類的Class對象不再被引用,即不可觸及時,Class對象就會結束生命周期,Sample類在方法區內的數據也會被卸載,從而結束Sample類的生命周期。

  由此可見,一個類何時結束生命周期,取決于代表它的Class對象何時結束生命周期。

引用關系
  加載器和Class對象:

  在類加載器的內部實現中,用一個Java集合來存放所加載類的引用。

  另一方面,一個Class對象總是會引用它的類加載器。調用Class對象的getClassLoader()方法,就能獲得它的類加載器。

  由此可見,Class實例和加載它的加載器之間為雙向關聯關系。

  類、類的Class對象、類的實例對象:

  一個類的實例總是引用代表這個類的Class對象。

  在Object類中定義了getClass()方法,這個方法返回代表對象所屬類的Class對象的引用。

  此外,所有的Java類都有一個靜態屬性class,它引用代表這個類的Class對象。

 

類的卸載
  由Java虛擬機自帶的類加載器所加載的類,在虛擬機的生命周期中,始終不會被卸載。

  前面介紹過,Java虛擬機自帶的類加載器包括根類加載器、擴展類加載器和系統類加載器。

  Java虛擬機本身會始終引用這些類加載器,而這些類加載器則會始終引用它們所加載的類的Class對象,因此這些Class對象始終是可觸及的。

  由用戶自定義的類加載器加載的類是可以被卸載的。

具體例子

從JVM分析Java的類的加載和卸載機制

loader1變量和obj變量間接應用代表Sample類的Class對象,而objClass變量則直接引用它。

  如果程序運行過程中,將上圖左側三個引用變量都置為null,此時Sample對象結束生命周期,MyClassLoader對象結束生命周期,代表Sample類的Class對象也結束生命周期,Sample類在方法區內的二進制數據被卸載。

  當再次有需要時,會檢查Sample類的Class對象是否存在,如果存在會直接使用,不再重新加載;如果不存在Sample類會被重新加載,在Java虛擬機的堆區會生成一個新的代表Sample類的Class實例(可以通過哈希碼查看是否是同一個實例)。

延伸 · 閱讀

精彩推薦
  • JAVA教程Java添加事件監聽的四種方法代碼實例

    Java添加事件監聽的四種方法代碼實例

    這篇文章主要介紹了Java添加事件監聽的四種方法代碼實例,本文直接給出代碼示例,并用注釋說明,需要的朋友可以參考下 ...

    junjie2962019-11-29
  • JAVA教程java全角、半角字符的關系以及轉換詳解

    java全角、半角字符的關系以及轉換詳解

    如果搞明白了Java中全角字符和半角字符之間的關系 那他們之間的轉換根本就不是個事. 全角字符與半角字符的關系 可以通過下面的程序看看Java中所有字符...

    java技術網4752019-10-22
  • JAVA教程JavaMe開發自適應滾動顯示

    JavaMe開發自適應滾動顯示

    我們常看到一些滾動顯示的實例,比如UC瀏覽器中,顯示網頁的內容。當內容比較多時,采用滾動分頁顯示是合理的。在Canvas中繪圖中,多余的內容被截斷...

    lijiao1522020-01-06
  • JAVA教程Jar打包用法詳解

    Jar打包用法詳解

    這篇文章主要介紹了Jar打包用法,詳解分析了jar打包命令的各種常見用法及參數含義,非常具有實用價值,需要的朋友可以參考下 ...

    shichen20142452019-12-06
  • JAVA教程圖解Eclipse j2ee開發環境的搭建過程

    圖解Eclipse j2ee開發環境的搭建過程

    這篇文章以圖文結合的方式介紹了Eclipse j2ee開發環境的搭建過程,內容很詳細,每一個步驟都有對應的操作截圖,需要的朋友可以參考下 ...

    mayabin2562020-01-02
  • JAVA教程Java中StringBuffer和StringBuilder區別

    Java中StringBuffer和StringBuilder區別

    這篇文章主要介紹了Java中StringBuffer和StringBuilder區別,本文只介紹了它們之間的核心區別,需要的朋友可以參考下 ...

    junjie3312019-12-21
  • JAVA教程Java實現Map集合二級聯動示例

    Java實現Map集合二級聯動示例

    Java實現Map集合二級聯動示例,需要的朋友可以參考下 ...

    java教程網3152019-11-11
  • JAVA教程Spring創建Bean的6種方式詳解

    Spring創建Bean的6種方式詳解

    這篇文章主要介紹了Spring創建Bean的6種方式詳解,本文講解了在Spring 應用中創建Bean的多種方式,包括自動創建,以及手動創建注入方式,實際開發中可以根...

    冬眠的山谷2292019-06-25
主站蜘蛛池模板: 欧美最猛性xxxxx69交 | 男女男精品网站 | 果冻传媒在线视频播放观看 | sese在线| 97超pen个人视频公开视频视 | xxxxxx日本处大片免费看 | 五月天婷婷网亚洲综合在线 | 四虎影院在线免费观看视频 | 大桥未久aⅴ一区二区 | 免费网址视频在线看 | 国产自拍影院 | 国产精品久久久久影视不卡 | 四虎1515hh.com| 男女做性视频 | 日本久久啪啪婷婷激情五月 | 亚洲男人第一天堂 | 国产一区精品视频 | 东京道一本热大交乱 | 精品夜夜澡人妻无码AV蜜桃 | 日日舔 | 久久se视频精品视频在线 | 亚洲成色WWW久久网站夜月 | 欧美一区精品 | 国产成人免费高清激情视频 | 91嫩草国产在线观看免费 | 西施打开双腿下面好紧 | 操双性人 | 九九精品影院 | 色综合久久天天综合 | 成人网中文字幕色 | 国产成人精品1024在线 | 操破苍穹小说 | 好大好硬好深好爽想要吃奶 | 91九色在线视频 | 胸奶好大好紧好湿好爽 | 风间由美理论片在线观看 | 日本色吧| 免费一区二区视频 | 欧美成人免费观看bbb | 我把校花黑色蕾丝胸罩脱了 | 果冻传媒天美传媒网址入口 |