天天看點

類加載及執行子系統的案例與實戰

在Class檔案格式與執行引擎這部分中,Class檔案以何種格式存儲,類型何時加載、如何連接配接以及虛拟機如何執行位元組碼指令等都是由虛拟機

直接控制行為,使用者程式無法對其進行改變。能通過程式進行操作的,主要是位元組碼生成與類加載器這兩部分。

主流的java web伺服器,如Tomcat、Jeety、WebLogic、WebSphere等都實作了自己定義的類加載器,因為他們需要解決一下問題:

1、部署在同一個伺服器上的兩個Web應用程式所使用的Java類庫可以實作隔離(如不用應用程式依賴不同版本的第三方庫)

2、部署在同一個伺服器上的兩個Web應用程式所使用的Java類庫可以互相共享(如使用同一個Spring)

3、伺服器需要盡可能保證自身的安全不受部署Web應用程式影響。

4、支援JSP應用的Web伺服器大多需要支援HotSwap(熱替換)功能,即JSP檔案修改後無需重新開機

通過加裝路徑來解決上述問題

Tomcat目錄結構中,有3組目錄:/common/、/server/ 、/shared/ 可以存放Java類庫,web應用程式自身的目錄/WEB-INF/也可以;

/common目錄中:類庫可以被Tomcat和所有web應用程式共同使用

/server目錄中:類庫僅能被Tomcat使用

/shared目錄中:可以被所有Web應用程式使用,Tomcat自身不可見

放置在/WEBApp/WEB-INF目錄中:僅可以被此Web應用程式使用

Tomcat 6.x以後/common、/server、/shared合并為/lib目錄

OSGi:Open Service Gateway initiative 是由 OSGi聯盟制訂的一個基于Java語言的動态子產品化規範

OSGi裡,子產品間的依賴關系從傳統的上層子產品依賴底層子產品轉變為平級子產品之間的依賴,而且類庫可見性控制精确,還可能實作子產品級别熱插拔。

上述功能都有因為OSGi可以靈活的類加載架構,OSGi 的子產品類加載器之間隻有規則,沒有固定委派關系。

OSGi裡面加載器之間的關系不再是雙親委派模型的樹形結構,而是更為複雜的運作時才能确定的網狀結構。