java虛擬機(而) - classloader隔離


三層classloader

Bootstrap classLoader:采用native code實現(xiàn),是JVM的一部分厦取,主要加載JVM自身工作需要的類忆首,如java.lang.*、java.uti.*等谅河; 這些類位于$JAVA_HOME/jre/lib/rt.jar框都。Bootstrap ClassLoader不繼承自ClassLoader,因為它不是一個普通的Java類霎箍,底層由C++編寫奇钞,已嵌入到了JVM內(nèi)核當中,當JVM啟動后漂坏,Bootstrap ClassLoader也隨著啟動景埃,負責加載完核心類庫后,并構(gòu)造Extension ClassLoader和App ClassLoader類加載器顶别。

ExtClassLoader:擴展的class loader谷徙,加載位于$JAVA_HOME/jre/lib/ext目錄下的擴展jar。

AppClassLoader:系統(tǒng)class loader驯绎,父類是ExtClassLoader完慧,加載$CLASSPATH下的目錄和jar;它負責加載應(yīng)用程序主函數(shù)類剩失。

應(yīng)用場景

有時候我們需要在一個 Project 中運行多個不同版本的 jar 包屈尼,以應(yīng)對不同集群的版本或其它的問題。如果這個時候選擇在同一個項目中實現(xiàn)這樣的功能拴孤,那么通常只能選擇更低版本的 jar 包脾歧,因為它們通常是向下兼容的,但是這樣也往往會失去新版本的一些特性或功能乞巧,所以我們需要以擴展的方式引入這些 jar 包涨椒,并通過隔離執(zhí)行,來實現(xiàn)版本的強制對應(yīng)绽媒。


注意事項

總的來說蚕冬,實現(xiàn)隔離允許指定 jar 包,主要需要做到以下幾點:

自定義 ClassLoader是辕,使其 Parent = null囤热,避免其使用系統(tǒng)自帶的 ClassLoader 加載 Class。

在調(diào)用相應(yīng)版本的方法前获三,更改當前線程的 ContextClassLoader旁蔼,避免擴展包的依賴包通過Thread.currentThread().getContextClassLoader()獲取到非自定義的 ClassLoader 進行類加載

通過反射獲取 Method 時锨苏,如果參數(shù)為自定義的類型,一定要使用自定義的 ClassLoader 加載參數(shù)獲取 Class棺聊,然后在獲取 Method伞租,同時參數(shù)也必須轉(zhuǎn)化為使用自定義的 ClassLoade 加載的類型(不同 ClassLoader 加載的同一個類不相等)




OSGI Classloader

在OSGI中,每一個Bundle有一個單獨的Classloader實例限佩。更具體點葵诈,BundleWiringImpl中定義了一個BundleClassLoader,每當加載一個bundle時祟同,框架創(chuàng)建一個BundleClassLoader實例負責該bundle相關(guān)class的加載工作作喘。

BundleClassLoader的加載順序如下:

如class在 java.*? package中,委托Bootstrap Classloader處理晕城;

如class定義在 OSGi 框架中啟動委托列表(org.osgi.framework.bootdelegation)中泞坦,則將加載請求委托給Bootstrap Classloader處理;

如class在 Import-Package 定義的package中砖顷,則框架找到導(dǎo)出此package的 Bundle 的 Class Loader贰锁,交其處理 。

如class屬于在 Require-Bundle 中定義的 Bundle择吊,則框架找到導(dǎo)出此package的Bundle的ClassLoader李根,交其處理槽奕。

Bundle 搜索自己的類資源 ( 包括 Bundle-Classpath 里面定義的類路徑和屬于 Bundle 的 Fragment 的類資源)几睛;

若類在 DynamicImport-Package 中定義,則開始嘗試在運行環(huán)境中尋找符合條件的 Bundle 粤攒。

Bundle之間隔離所森,但如果存在import關(guān)系又可以委托給相應(yīng)export的classloader處理。實現(xiàn)上無非是維護了多個import bundle的Classloader夯接,查找時調(diào)用其find方法實現(xiàn)焕济。

需要注意的是:查找時優(yōu)先查找Import-Package、Require-Bundle中的類盔几,隨后才是查找Bundle自己的類晴弃。這里又引入另外一個疑問,Embed-Dependency使用問題逊拍。

簡單來說上鞠,如果一個Bunlde 需要使用protobuf-java.jar,有如下兩種使用方式:

普通的dependency方式使用芯丧,如下圖的Component C的使用方式芍阎。

Embed-dependency方式使用,如下圖的ComponentA缨恒、ComponentB谴咸,此時將protobuf-java做為Bundle自身的一部分使用轮听。


最后再來講一下,為什么每個bundle需要分配單獨的Classloader岭佳,解決什么問題血巍。在我看來,最主要的原因有如下兩個:

定制導(dǎo)出類珊随。非osgi環(huán)境下藻茂,所有package中的java類都將被導(dǎo)出,無法限定哪些只能jar內(nèi)使用玫恳,哪些是需要export出去的辨赐。存在各種誤用,耦合使用情況京办。

多版本控制掀序。非osgi環(huán)境下,一個jvm對于一個類只允許存在一個版本惭婿。osgi中每個bundle是獨立開發(fā)演進的不恭,可能出現(xiàn)同時存在多個版本。


# OSGi動態(tài)加載刪除bundle

使用監(jiān)聽器?listeners?

ServiceListener?和ServiceTracker?提供bundle和service的動態(tài)監(jiān)聽财饥,ServiceTracker可以動態(tài)監(jiān)聽未來的bundle和service(OSGi Release 2提供的ServiceTracker?换吧,一般推薦)

通過Declarative Service?(OSGi?DS,或者Spring Dynamic Module?(DM))的方式(OSGi Release 4開始钥星,重點推薦U赐摺)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市谦炒,隨后出現(xiàn)的幾起案子贯莺,更是在濱河造成了極大的恐慌,老刑警劉巖宁改,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缕探,死亡現(xiàn)場離奇詭異,居然都是意外死亡还蹲,警方通過查閱死者的電腦和手機爹耗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谜喊,“玉大人潭兽,你說我怎么就攤上這事」郏” “怎么了讼溺?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長最易。 經(jīng)常有香客問我怒坯,道長炫狱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任剔猿,我火速辦了婚禮视译,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘归敬。我一直安慰自己酷含,他們只是感情好,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布汪茧。 她就那樣靜靜地躺著椅亚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舱污。 梳的紋絲不亂的頭發(fā)上呀舔,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天,我揣著相機與錄音扩灯,去河邊找鬼媚赖。 笑死,一個胖子當著我的面吹牛珠插,可吹牛的內(nèi)容都是我干的惧磺。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼捻撑,長吁一口氣:“原來是場噩夢啊……” “哼磨隘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起布讹,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤琳拭,失蹤者是張志新(化名)和其女友劉穎训堆,沒想到半個月后描验,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡坑鱼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年膘流,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲁沥。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡呼股,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出画恰,到底是詐尸還是另有隱情彭谁,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布允扇,位于F島的核電站缠局,受9級特大地震影響则奥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜狭园,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一读处、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唱矛,春花似錦罚舱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窃肠,卻和暖如春渐北,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背铭拧。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工赃蛛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搀菩。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓呕臂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肪跋。 傳聞我的和親對象是個殘疾皇子歧蒋,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361