JVM——三個ClassLoader詳解

  類裝載工作由ClassLoader及其子類負責,ClassLoader是一個重要的Java執行時系統組件,它負責在運行時查找和裝入Class字節碼文件。JVM在運行時會產生三個ClassLoader:根裝載器ExtClassLoader(擴展類裝載器)和AppClassLoader(系統類裝載器)。其中,根裝載器不是ClassLoader的子類,它使用C++編寫,因此我們在Java中看不到它,根裝載器負責裝載JRE的核心類庫,如JRE目標下的rt.jar、charsets.jar等。ExtClassLoader和AppClassLoader都是ClassLoader的子類。其中ExtClassLoader負責裝載JRE目錄ext中的JAR類包;AppClassLoader負責裝載ClassPath路徑下的類包。

  • 啟動類加載器(Bootstrap ClassLoader):這個類加載器負責將存放在<JAVA_HOME>\lib目錄中的。啟動類加載器無法被Java程序直接引用,用戶在編寫自定義類加載器時,如果需要把加載請求委派給引導類加載器,那直接使用null代替即可。
  • 擴展類加載器(Extension ClassLoader):這個加載器由sun.misc.Launcher$ExtClassLoader實現,它負責加載<JAVA_HOME>\lib\ext目錄中的,或者被java.ext.dirs系統變量所指定的路徑中的所有類庫,開發者可以直接使用擴展類加載器。
  • 應用程序類加載器(Application ClassLoader):這個類加載器由sun.misc.Launcher$AppClassLoader實現。由于這個類加載器是ClassLoader中的getSystemClassLoader()方法的返回值,所以一般也稱它為系統類加載器。它負責加載用戶類路徑(ClassPath)上所指定的類庫,開發者可以直接使用這個類加載器,如果應用程序中沒有自定義自己的類加載器,一般情況下這個就是程序中默認的類加載器。

  我們的應用程序都是由這3種類加載器互相配合進行加載的,如果有必要,還可以加入自己定義的類加載器。這些類加載器之間的關系一般為:

  上圖展示的類加載器之間的這種層次關系,稱為類加載器的雙親委派模型。雙親委派模型要求除了頂層的啟動類加載器外,其余的類加載器都應當有自己的父類加載器。這里類加載器之間的父子關系一般不會以繼承的關系來實現,而是都使用組合關系來復用父加載器的代碼。

  類加載器的雙親委派模型詳解博客鏈接

  這三個類裝載器之間存在父子層級關系,即根裝載器是ExtClassLoader的父裝載器,ExtClassLoader是父類裝載器。默認情況下,使用AppClassLoader裝載應用程序的類,用以下代碼證明:

 1 /**
 2  * @author zhengbinMac
 3  */
 4 public class ClassLoaderTest {
 5 
 6     public static void main(String[] args) {
 7         ClassLoader loader = Thread.currentThread().getContextClassLoader();
 8         System.out.println("current loader:" + loader);
 9         System.out.println("parent loader:" + loader.getParent());
10         System.out.println("grandparent loader:" + loader.getParent().getParent());
11     }
12     /*
13      * output:
14      *    current loader:sun.misc.Launcher$AppClassLoader@1b6d3586
15      *    parent loader:sun.misc.Launcher$ExtClassLoader@1540e19d 
16      *    grandparent loader:null // 因為根類裝載器在Java中訪問不到,所有返回null
17      */
18 }

  Thread.currentThread():返回對當前正在執行的線程對象的引用。

  getContextClassLoader():返回該線程的上下文 ClassLoader。

  通過以上的輸出信息,可以明白,ClassLoader是AppClassLoader,父ClassLoader是ExtClassLoader,祖父ClassLoader是根類裝載器,因為在Java中無法獲得它的句柄,所以直接返回null。

  除了JVM默認的三個ClassLoader以外,可以編寫自己的第三方類裝載器,以實現一些特殊的需求。類文件被裝載并解析后,在JVM內將擁有一個對應的java.lang.Class類描述對象,該類的實例都擁有指向這個類描述對象的引用,而類描述對象又擁有指向關聯ClassLoader的引用。如下圖所示:

ClassLoader重要方法


  在Java中,ClassLoader是一個抽象類,位于java.lang包中。下面對該類的一些重要接口方法進行介紹:

  • Class loadClass(String name)

  name參數指定類裝載器需要裝載類的名字,必須使用全限定類名,如com.zhengbin.entity.Student。該方法有一個重載方法loadClass(String name, boolean resolve),resolve參數告訴類裝載器是否需要解析該類。在初始化類之前,應考慮進行類解析的工作,但并不是所有的類都需要解析,如果JVM只需要知道該類是否存在或找出該類的超類,那么就不需要進行解析。

  • Class defineClass(String name, byte[] b, int off, int len)

  將類文件的字節數組轉換成JVM內部的java.lang.Class對象。字節數組可以從本地文件系統、遠程網絡獲取。name為字節數組對應的全限定類名。

  • Class findSystemClass(String name)

  從本地文件系統載入Class文件,如果本地文件系統不存在該Class文件,將拋出ClassNotFoundException異常。該方法是JVM默認使用的裝載機制。

  • ClassLoader getParent()

  獲取類裝載器的父裝載器,除根裝載器外,所有的類裝載器都有且僅有一個父裝載器,ExtClassLoader的父裝載器是根裝載器,因為根裝載器非Java編寫,所以無法獲得,將返回null。

轉載于:https://www.cnblogs.com/zhengbin/p/5631987.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271480.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++頭文件_51單片機C語言編程知多少:幾人不知頭文件,你要的干貨在這里了

近期寫了一些比較大的單片機程序&#xff0c;找了很多參考資料&#xff0c;看了大量別人的程序。我從中發現了自己對于C語言編程還只是知道如何實現功能&#xff0c;但對編程規范掌握的不好&#xff0c;編程習慣也沒有很好的養成。學了這么久的單片機&#xff0c;還真是挺難為情…

最常問的MySQL面試題集合

除了基礎題部分&#xff0c;本文還收集整理的MySQL面試題還包括如下知識點或題型&#xff1a;MySQL高性能索引SQL語句MySQL查詢優化MySQL高擴展高可用MySQL安全性問題1&#xff1a;char、varchar的區別是什么&#xff1f;varchar是變長而char的長度是固定的。如果你的內容是固定…

計算機打印機共享失敗,局域網共享打印機連接失敗怎么辦

在局域網中由于辦公需要&#xff0c;經常要連接網絡打印機&#xff0c;但是有時候就無法連接&#xff0c;提示各種連接失敗&#xff0c;下面是學習啦小編給大家整理的一些有關局域網共享打印機連接失敗的解決方法&#xff0c;希望對大家有幫助!局域網共享打印機連接失敗的解決方…

高斯模糊java代碼_OpenCV3 Java圖形圖像上的高斯模糊(Imgproc.GaussianBlur)

代碼案例&#xff1a;package com.what21.opencv.demo;import org.opencv.core.Core;import org.opencv.core.Mat;import org.opencv.core.Size;import org.opencv.imgcodecs.Imgcodecs;import org.opencv.imgproc.Imgproc;public class GaussianBlur {public static void main…

實時數據集成

企業應用集成 面向服務的體系結構 (SOA) 目前應該是一個很受歡迎的名詞&#xff0c;中間件技術人員幾乎到了言必稱SOA的程度&#xff0c;數據集成當然也不例外&#xff0c;在Oracle openworld2008大會上&#xff0c;就推出了一堆數據集成的專場演講&#xff0c;其中和SOA結合最…

idea 中代碼大小寫切換快捷鍵

idea用使用 CTRL SHIFT U 使用前&#xff1a; 使用后&#xff1a;

nginx做服務器入口_Nginx實現http反向代理

什么是反向代理&#xff1f;反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服務器來接受internet上的連接請求&#xff0c;然后將請求轉發給內部網絡上的服務器&#xff0c;并將從服務器上得到的結果返回給internet上請求連接的客戶端&#xff0c;此時代理服務器…

操作系統基礎:進程知識筆記(二)

一、管程 1、管道概念概念 管道是用于連接一個讀進程和一個寫進程。用來實現它們之間通信的共享文件。 2、管程的概念 管程是由一些共享數據、一組能為并發進程所執行的作用在共享數據上的操作集合、初始代碼、以及存取權組成。管程提供了一種可以允許多線程安全、有效地共享抽…

怎樣保護計算機連接線,一根網線把電腦燒了:雷雨天如何保護家電?

記得在小時候&#xff0c;每逢遇到雷雨天氣&#xff0c;爸媽總會讓我們關掉電視機、電腦等家電&#xff0c;雖然很不情愿&#xff0c;但為了避免電器遭受雷擊造成損壞&#xff0c;我們還是會照做。現在長大了&#xff0c;除了知其然&#xff0c;還更要知其所以然&#xff0c;那…

HDU5697 刷題計劃 dp+最小乘積生成樹

分析&#xff1a;就是不斷遞歸尋找靠近邊界的最優解 學習博客&#xff08;必須先看這個&#xff09;&#xff1a; 1&#xff1a;http://www.cnblogs.com/autsky-jadek/p/3959446.html 2&#xff1a;http://blog.csdn.net/u013849646/article/details/51524748 注&#xff1a;這…

pos加盟申請php_ThinkPHP萬能表單程序源碼 報名預約加盟申請調查表單程序源碼

平臺聲明&#xff1a;本商品由平臺商家發布&#xff0c;如果本商品源碼侵犯了您的利益請在上方價格右側或聯系平臺客服舉報。微信表單-實現各行業的報名、預約、加盟申請、問卷調查等應用01.自定義表單模型(自定義字段支持字符串、數字、單選、多選、下拉、日歷、時間、郵件、省…

分析Java中的三種不同變量的區別

1、首先分析Java中的三種不同變量的區別&#xff0c;如下表所示 概念默認值其他類變量 也叫靜態變量&#xff0c;是類中獨立于方法之外的變量 用static 修飾 有默認初始值&#xff0c;系統自動初始化。 如boolean默認為false. 可以被public&#xff0c;protect&#xff0c;pr…

分享我常用的5個免費的在線 SQL 數據庫環境,簡直太方便了!

大今天給大家分享幾個在線的免費 SQL 運行環境&#xff0c;也就是在線數據庫。這些網站可以幫助我們快速運行一些 SQL 語句的測試或者驗證&#xff0c;同時還可以在網絡上進行分享&#xff0c;關鍵不需要自己安裝數據庫。SQL FiddleSQL Fiddle 提供了 MySQL、Oracle、PostgreSQ…

python刷題用leet_GitHub - Yolymaker/leetcode-python: 利用python分類刷leetcode題目

leetcode分類高效刷題 leetcode是一個很好的學習算法的一個online judge的網站&#xff0c;通過刷題能夠快速提升自己的算法能力。但是令大家都頭疼的就是&#xff0c;怎么能夠高效的通過leetcode刷題掌握算法的做題技巧&#xff0c;并且順利通過面試。 刷題的時候千萬不要懷疑…

36歲 計算機博士,36歲考博士

博士生在學習期間&#xff0c;須在國內外核心期刊上正式發表與學位論文緊密相關(構成學位論文的主要組成部分)的學術論文且積分必須在6分(含6分)以上方可申請授予學位。以上發表的論文應以**大學商學院為第一署名單位&#xff0c;博士生為第一作者或導師為第一作者、博士生為第…

OPTIMIZE TABLE

INNODB 不支持mysql> OPTIMIZE TABLE t; ----------------------------------------------------------------------------------------------- | Table | Op | Msg_type | Msg_text | ------------------…

r語言 面板數據回歸_R語言_018回歸

回歸分析是統計學的核心。它其實是一個廣義的概念&#xff0c;指那些用一個或多個預測變量來預測響應變量的方法。通常&#xff0c;回歸分析可以用來挑選與響應變量相關的解釋變量&#xff0c;可以描述兩者的關系&#xff0c;也可以生成一個等式&#xff0c;通過解釋變量來預測…

Integer對象范圍(-128-127)之間(Integer. valueOf()方法)

1.Integer. valueOf()方法的作用 Integer. valueOf()可以將基本類型int轉換為包裝類型Integer&#xff0c;或者將String轉換成Integer&#xff0c;String如果為Null或“”都會報錯 看下面代碼示例 取值為127時 取值為128時 為什么會是這樣呢&#xff1f; 首先&#xff0c;我們…

操作系統基礎:進程知識筆記(三)

1、死鎖概念知識 計算機中存在許多互斥資源&#xff08;打印機&#xff09;、軟件資源&#xff08;進程表、臨界區&#xff09;如果兩個進程同時調用打印機&#xff0c;或同時進入臨界區必然會出現問題。 死鎖&#xff1a;指兩個以上的進程互相要求對方已經占有的資源導致無法繼…