摘要:類加載器三杰有三類,分別是以及。線程上下文類加載器線程上下文類加載器可以不遵循雙親委派機制。免費領取驗證碼內容安全短信發送直播點播體驗包及云服務器等套餐更多網易技術產品運營經驗分享請訪問網易云社區。文章來源網易云社區
本文由作者張遠道授權網易云社區發布。
類加載器三杰
jvm有三類classloader,分別是bootstrap classloader,extended classloader以及system classloader。
bootstrap classloader是系統在啟動jvm時默認加載的。當用戶在命令行輸入java Test時,系統會首先加載jvm。在windows系統下,jvm的路徑通常位于%JAVA_HOME%/jdk/jre/client/jvm.dll和%JAVA_HOME%/jdk/jre/server/jvm.dll.
bootstrap classloader加載后,會載入extended classloader,并將extended classloader的父類設為bootstrap classloader。然后,bootstrap classloader接著載入system classloader,并將system classloader的父類設為extended classloader。至此,bootstrap--extended--system三級繼承結構形成。
bootstrap classloader在jvm啟動之后自動加載。bootstrap classloader由c實現,不屬于java類。
extended classloader由java實現,通常為sun.misc.Lancher$ExtClassLoader.
system classloader由java實現,通常為sun.misc.Lancher$AppClassLoader.
其中,
bootstrap classloader負責加載sun.boot.class.path路徑下的.class文件以及jar包。
extended classloader負責加載java.ext.dirs路徑下的.class文件以及jar包。
system classloader負責加載java.class.path路徑下的.class文件以及jar包。
sun.boot.class.path通常對應環境變量CLASSPATH的路徑。
java.ext.dirs通常對應JAVA_HOME/jre/lib/ext目錄。
java.class.path對應用戶自身的類路徑。
類加載到何處
據可靠情報,jvm由方法區,堆,棧,pc寄存器和本地方法棧構成。類加載器的任務就是將class二進制文件加載到方法區,供虛擬機模制出在堆中存放的對象。
雙親委托機制
classloader加載類的過程為:
檢查被加載類是否被加載。
如果沒有被加載則調用父classloader加載該類。
如果1、2不成功,則仍由自身進行類加載。
這種機制又叫雙親委派機制。
雙親委派機制的好處是,避免多個類加載器加載同一個類的不同拷貝到內存(jvm的方法區)中。因為如果類A由ClassLoaderA加載,同時,又被ClassLoaderB加載,這樣,內存中就會存在兩份不同的A的定義,于是形成A既是ClassLoaderA罩的,又是ClassLoaderB罩著,造成災難性后果。
用戶自定義類的加載順序通常為:
首先調用AppClassLoader加載類,AppClassLoader調用ExtClassLoader,ExtClassLoader調用BootClassLoader,BootClassLoader在sun.boot.class.path尋找改類,沒找到,加載失??;ExtClassLoader也未加載類,失敗,最后由AppClassLoader加載成功。從這個加載順序可以看出來,三個類加載器的對類的可見性是不同的。
java中的類是由java的全名以及類的classloader來限定的。只有當二者完全一樣才會認為是同一個類。否則是不同的類。因此,可以定義一個同名的類,包名也一樣,只要保證該類被不同的類加載器加載即可。
當前類加載器和線程上下文類加載器
當前類加載器
當前類加載器是指當前方法所在的類使用的類加載器。在程序中使用Class.forName或者Class.getResource抑或Class.class時就是使用的該類加載器。
線程上下文類加載器
線程上下文類加載器可以不遵循雙親委派機制。線程的上下文類加載器有Thread.currentThread().setContextClassLoader()來為當前線程設置線程上下文類加載器。如果沒有設置當前線程的上下文類加載器,則繼承父類的上下文類加載器。
為什么還需要線程上下文類加載器?
考慮一種情況,當我們的程序必須由jvm的核心代碼去加載第三方類的時候。比如jndi,jndi的核心是rt.jar包中實現的,由Bootstrap classloader負責加載,但是jndi必須加載第三方廠商的具體的jndi實現,這個時候調用Bootstrap加載只對其子類加載器可見的類,就會出現失敗。這個時候就可以使用線程上下文類加載器。
免費領取驗證碼、內容安全、短信發送、直播點播體驗包及云服務器等套餐
更多網易技術、產品、運營經驗分享請訪問網易云社區。
文章來源: 網易云社區
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25357.html
摘要:而熱部署技術能夠幫助開發人員減少重新部署的等待時間。本文的目的為調研熱部署的技術現狀及其對開發效率的幫助,并簡單梳理其技術實現的難點。熱部署技術總結熱部署目前有多種技術實現官方開源商業。 開發、自測、聯調期間代碼可能會被頻繁地修改,通常即使只增加了一行代碼,都需要重啟容器以檢查執行效果。而熱部署技術能夠幫助開發人員減少重新部署的等待時間。本文的目的為調研熱部署的技術現狀及其對開發效率的...
摘要:同時也有一些兒高級的處理,比如批處理更新事務隔離和可滾動結果集等。連接對象表示通信上下文,即,與數據庫中的所有的通信是通過此唯一的連接對象。因為是針對類的關系而言,所以一個對象對應多個類的實例化。返回表示查詢返回表示其它操作。 JDBC是什么? JDBC是一個Java API,用中文可以通俗的解釋為,使用Java語言訪問訪問數據庫的一套接口集合。這是調用者(程序員)和實行者(數據庫廠商...
摘要:作用負責將加載到中審查每個類由誰加載父優先的等級加載機制將字節碼重新解析成統一要求的對象格式類結構分析為了更好的理解類的加載機制,我們來深入研究一下和他的方法。就算兩個是同一份字節碼,如果被兩個不同的實例所加載,也會認為它們是兩個不同。 申明:本文首發于 詳細深入分析 ClassLoader 工作機制 ,如有轉載,注明原出處即可,謝謝配合。 什么是 ClassLoader ? 大家...
摘要:它們是通過來自遠程的服務器的連接發送字節碼并在本地運行,這一點令人興奮。中有一個自定義的,它不是從本地文件系統加載類文件,而是從遠程服務器上獲取,通過加載原始字節碼,再在中轉化為類。它將字節碼解析為運行時的數據結構,檢查其有效性等。 前言 Java ClassLoader是java運行系統中一個至關重要但是經常被忽略的組件。它負責在運行時尋找并加載類文件。創建自定義的ClassLoad...
閱讀 787·2021-11-12 10:36
閱讀 3363·2021-09-08 10:44
閱讀 2739·2019-08-30 11:08
閱讀 1393·2019-08-29 16:12
閱讀 2668·2019-08-29 12:24
閱讀 888·2019-08-26 10:14
閱讀 676·2019-08-23 18:32
閱讀 1160·2019-08-23 17:52