cuiyi's blog(崔毅 crazycy)

          記錄點(diǎn)滴 鑒往事之得失 以資于發(fā)展
          數(shù)據(jù)加載中……

          ClassLoader專(zhuān)題(一):ClassLoader基礎(chǔ)

          ClassLoader 專(zhuān)題(一): ClassLoader 基礎(chǔ)

          ClassLoader 專(zhuān)題(二):從 Servlet 容器看 ClassLoader 機(jī)制的妙用
              ClassLoader專(zhuān)題(三):引文 

           

          JVM啟動(dòng),會(huì)形成3個(gè)類(lèi)加載器組成的初始化加載器層次結(jié)構(gòu):
          bootstap classloader (加載核心類(lèi))
                  ||
          extension classloader(加載ext(目錄),即java.ext.dirs())
                  ||
          system classloader   (加載-classpath或者java.class.path或者CLASSPATH)


          ClassLoader機(jī)制:
          a)全盤(pán)負(fù)責(zé):一個(gè)classloader加載一個(gè)class后,這個(gè)class所引用或者依賴(lài)的類(lèi)也由這個(gè)classloader載入,除非顯示的用另一個(gè)classloader載入
          b)委托機(jī)制:先由父加載器加載,除非父加載器找不到時(shí)才從自己的類(lèi)路徑中去尋找
          c)Cache機(jī)制:classloader采用緩存機(jī)制,即先查cache;若cache中保存了這個(gè)class就直接返回;若無(wú),才從文件讀取和轉(zhuǎn)化為class并放入cache

           

          ClassLoader加載類(lèi)順序:
          1)檢查cache是否有該類(lèi):
              11)若有直接返回
              12)若無(wú),請(qǐng)求父類(lèi)加載
                  121) 若無(wú)父,則從bootstap classloader加載
          2)加載:
              21)尋找class文件(叢與此classloader相關(guān)的類(lèi)路徑中尋找)
              22)從文件載入class
              23)找不到則拋出ClassNotFoundeException
          3)擴(kuò)展:
              記載時(shí)即2),覆寫(xiě)findClass可以實(shí)現(xiàn)自己的載入策略
              記載時(shí)即2),覆寫(xiě)loadClass來(lái)實(shí)現(xiàn)自己的載入過(guò)程


          如何實(shí)現(xiàn)運(yùn)行時(shí)動(dòng)態(tài)載入與更新
          本質(zhì):只要?jiǎng)討B(tài)改類(lèi)搜索路徑和清除classloader的cache已載入的class就ok
          做法:
          1)繼承ClassLoader:覆寫(xiě)loadClass方法,動(dòng)態(tài)尋找class文件
          2)只要重新使用一個(gè)新的類(lèi)搜索路徑來(lái)new一個(gè)classloader就可以,這樣既更新了類(lèi)的搜索路徑以便來(lái)載入新的class,也更新生成了一個(gè)空白的cache


          classloader載入的方式
          1)Pre-loading 預(yù)先載入,載入基礎(chǔ)類(lèi)
          2)load-on-demand 按需求載入


          JDK為啥有兩個(gè)JRE?
          JDK中jre是運(yùn)行java本身的程序,如javac
          ProgramFile(默認(rèn)安裝)中jre是運(yùn)行用戶編寫(xiě)的java程序

          posted on 2007-02-01 20:48 crazycy 閱讀(5095) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): JavaSE語(yǔ)言

          評(píng)論

          # re: ClassLoader專(zhuān)題一:ClassLoader基礎(chǔ)  回復(fù)  更多評(píng)論   

          ContextClassloader也很重要,

          JDK為啥2個(gè)JRE?
          看這里http://java.sun.com/javase/6/docs/
          JDK本身包含一個(gè)JRE.
          放在programfile只是為了方便,沒(méi)有區(qū)別.
          Unix-like系統(tǒng)里面一般安裝就只有一個(gè)jre,也就是jdk里面的那個(gè)jre.
          2007-02-01 21:02 | colorzhang

          # re: ClassLoader專(zhuān)題(一):ClassLoader基礎(chǔ)  回復(fù)  更多評(píng)論   

          研究好了 ClassLoader 可以給自己的應(yīng)用加入熱切換, 熱部署, 熱替換功能, 那樣就是高高手了!
          2007-02-03 19:56 | BeanSoft

          # re: ClassLoader專(zhuān)題(一):ClassLoader基礎(chǔ)  回復(fù)  更多評(píng)論   

          @BeanSoft
          甚是啊
          潛心修行中
          2007-05-05 01:32 | crazycy

          # re: ClassLoader專(zhuān)題(一):ClassLoader基礎(chǔ)  回復(fù)  更多評(píng)論   

          @colorzhang
          這個(gè)地方受教了;

          programfile 下的jre主要為ie等服務(wù),呵呵
          2007-05-05 01:33 | crazycy

          # re: ClassLoader專(zhuān)題(一):ClassLoader基礎(chǔ)  回復(fù)  更多評(píng)論   

          請(qǐng)教下:
          2)只要重新使用一個(gè)新的類(lèi)搜索路徑來(lái)new一個(gè)classloader就可以,這樣既更新了類(lèi)的搜索路徑以便來(lái)載入新的class,也更新生成了一個(gè)空白的cache

          “重新使用一個(gè)新的類(lèi)搜索路徑” , 這句是什么意思 ,能舉個(gè)例子么?
          2008-11-05 14:02 | hackerZxf
          主站蜘蛛池模板: 古蔺县| 永兴县| 大埔县| 岢岚县| 嘉祥县| 拉孜县| 达日县| 定陶县| 镇原县| 象山县| 托克逊县| 万年县| 嘉峪关市| 九寨沟县| 平罗县| 沿河| 乌兰浩特市| 易门县| 峨边| 太仆寺旗| 无为县| 灌南县| 松桃| 库车县| 邢台市| 新竹市| 合水县| 荣成市| 抚远县| 平顺县| 甘孜| 古丈县| 抚顺市| 昂仁县| 山东省| 洛川县| 如东县| 京山县| 关岭| 绥芬河市| 云梦县|