Websphere的类加载器以及策略的简单介绍
轉(zhuǎn)載自: https://blog.csdn.net/eric_sunah/article/details/17289985
1.1???? 什么是ClassLoader
顧名思義,類加載器(class loader)用來(lái)加載 Java 類到 Java 虛擬機(jī)中。一般來(lái)說(shuō),Java 虛擬機(jī)使用 Java 類的方式如下:Java 源程序(.java 文件)在經(jīng)過(guò) Java 編譯器編譯之后就被轉(zhuǎn)換成 Java 字節(jié)代碼(.class 文件)。類加載器負(fù)責(zé)讀取 Java 字節(jié)代碼,并轉(zhuǎn)換成 java.lang.Class類的一個(gè)實(shí)例。每個(gè)這樣的實(shí)例用來(lái)表示一?? 個(gè)Java 類。通過(guò)此實(shí)例的 newInstance()方法就可以創(chuàng)建出該類的一個(gè)對(duì)象。實(shí)際的情況可能更加復(fù)雜,比如 Java 字節(jié)代碼可能是通過(guò)工具動(dòng)態(tài)生成的,也可能是通過(guò)網(wǎng)絡(luò)下載的。
基本上所有的類加載器都是 java.lang.ClassLoader類的一個(gè)實(shí)例。下面詳細(xì)介紹這個(gè) Java 類。
1.2???? ClassLoader? 的職責(zé)
java.lang.ClassLoader類的基本職責(zé)就是根據(jù)一個(gè)指定的類的名稱,找到或者生成其對(duì)應(yīng)的字節(jié)代碼,然后從這些字節(jié)代碼中定義出一個(gè) Java 類,即 java.lang.Class類的一個(gè)實(shí)例。除此之外,ClassLoader還負(fù)責(zé)加載 Java 應(yīng)用所需的資源,如圖像文件和配置文件等。不過(guò)本文只討論其加載類的功能。
?
1.3???? 什么是ClassLoader Delegation
細(xì)節(jié)請(qǐng)參見:http://blog.csdn.net/eric_sunah/article/details/7969077
關(guān)于類加載器的層次結(jié)構(gòu),以下的幾點(diǎn)說(shuō)明可能更有助于進(jìn)一步的理解類的查找和加載過(guò)程:
- 每個(gè)類加載器負(fù)責(zé)在自身定義的類路徑上進(jìn)行查找和加載類。
- 一個(gè)子類加載器能夠委托它的父類加載器查找和加載類,一個(gè)加載類的請(qǐng)求會(huì)從子類加載器發(fā)送到父類加載器,但是從來(lái)不會(huì)從父類加載器發(fā)送到子類加載器。
- 一旦一個(gè)類被成功加載, JVM 會(huì)緩存這個(gè)類直至其生命周期結(jié)束,并把它和相應(yīng)的類加載器關(guān)聯(lián)在一起,這意味著不同的類加載器可以加載相同名字的類。
- 如果一個(gè)加載的類依賴于另一個(gè)或一些類,那么這些被依賴的類必須存在于這個(gè)類的類加載器查找路徑上,或者父類加載器查找路徑上。
如果一個(gè)類加載器以及它所有的父類加載器都無(wú)法找到所需的類,系統(tǒng)就會(huì)拋出 ClassNotFoundExecption 異常或者 NoClassDefFoundError 的錯(cuò)誤
1.4???? WAS的Class Loader
WebSphere 中類加載器的層次結(jié)構(gòu)圖1 所示:
如上圖所示,WebSphere 中類加載器被組織成一個(gè)自上而下的層次結(jié)構(gòu),最上層是系統(tǒng)的運(yùn)行環(huán)境JVM ,最下層是具體的應(yīng)用程序,上下層之間形成父子關(guān)系。
- JVM Class loader :位于整個(gè)層次結(jié)構(gòu)的最上層,它是整個(gè)類加載器層次結(jié)構(gòu)的根,因此它沒有父類加載器。這個(gè)類加載器負(fù)責(zé)加載 JVM 類, JVM 擴(kuò)展類,以及定義在 classpath 環(huán)境變量上的所有的 Java 類。
- WebSphere Extensions Class loader : WebSphere 擴(kuò)展類加載器 , 它將加載 WebSphere 的一些 runtime 類,資源適配器類等。
- WebSphere lib/app Class loader : WebSphere 服務(wù)器類加載器,它將加載 WebSphere 安裝目錄下 $(WAS_HOME)/lib/app 路徑上的類。 在 WAS v4 版本中, WAS 使用這個(gè)路徑在所有的應(yīng)用程序之間共享 jar 包。從 WAS v5 開始, 共享庫(kù)功能提供了一種更好的方式,因此,這個(gè)類加載器主要用于一些原有的系統(tǒng)的兼容。
- WebSphere "server" Class loader : WebSphere 應(yīng)用服務(wù)器類加載器。 它定義在這個(gè)服務(wù)器上的所有的應(yīng)用程序之間共享的類。 WAS v5 中有了共享庫(kù)的概念之后,可以為應(yīng)用服務(wù)器定義多個(gè)與共享庫(kù)相關(guān)聯(lián)的類加載器,他們按照定義的先后順序形成父子關(guān)系。
- Application Module Class Loader :應(yīng)用程序類加載器,位于層次結(jié)構(gòu)的最后一層,用于加載 J2EE 應(yīng)用程序。根據(jù)應(yīng)用程序的類加載策略的不同,還可以為 Web 模塊定義自己的類加載器。
1.5???? WebSphere 中的類加載器策略
WebSphere 中對(duì)類加載器有一些相關(guān)的配置,稱為類加載器策略(class loader policy )。類加載器策略指類加載器的獨(dú)立策略(classloader isolation policy ), 通過(guò)類加載器策略設(shè)置,我們可以為WAS 和應(yīng)用程序的類加載器進(jìn)行獨(dú)立定義。
每個(gè)WAS 可以配置自己的應(yīng)用程序類加載器策略,WAS 中的每個(gè)應(yīng)用程序也可以配置自己的Web 模塊類加載器策略,下面我們對(duì)這兩種策略分別介紹。
(官方配置手冊(cè):http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frzatz%2F51%2Fprogram%2Fclsadmcns.htm)
1.5.1???應(yīng)用服務(wù)器(WAS )配置:應(yīng)用程序類加載器策略
應(yīng)用服務(wù)器對(duì)應(yīng)用程序類加載器策略有兩種配置:
- Single :整個(gè)應(yīng)用服務(wù)器上的所有應(yīng)用程序(Jar,RAR,EJBJAR)使用同一個(gè)類加載器(Application classloader)。在這種配置下,每個(gè)應(yīng)用程序不再有自己的類加載器,每個(gè)Application中jar文件可以互相訪問(wèn)。
部署模型如下:
?
- Multiple(DEFAULT) :應(yīng)用服務(wù)器上的每個(gè)應(yīng)用程序使用自己的類加載器。
部署模型如下:
?
- WAR如何被加載,由WAR單獨(dú)的側(cè)率來(lái)決定
1.5.2??? 應(yīng)用程序配置:Web 模塊類加載器策略
應(yīng)用程序中對(duì)Web模塊類加載器有兩種配置:
- Application :整個(gè)應(yīng)用程序內(nèi)的所有的實(shí)用程序 jar 包和 Web 模塊使用同一個(gè)類加載器。
- Module(DEFAULT) :應(yīng)用程序內(nèi)的每個(gè) Web 模塊使用自己的類加載器。應(yīng)用程序的類加載器仍然存在,負(fù)責(zé)加載應(yīng)用程序中 Web 模塊以外的其它類,包括所有的實(shí)用程序 jar 包。
?
1.5.3?ClassLoader模式的設(shè)置
該設(shè)置針對(duì)Application/WAR加載器都有效
- Parent_First :在加載類的時(shí)候,在從類加載器自身的類路徑上查找加載類之前,首先嘗試在父類加載器的類路徑上查找和加載類。
- Parent_Last :在加載類的時(shí)候,首先嘗試從自己的類路徑上查找加載類,在找不到的情況下,再嘗試父類加載器類路徑。
1.6???? 綜合配置的小例子
?
總結(jié)
以上是生活随笔為你收集整理的Websphere的类加载器以及策略的简单介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 查看was中项目类的加载顺序
- 下一篇: 分步式事务