JVM體系結(jié)構(gòu)

JVM體系結(jié)構(gòu)

ClassLoader

將Class加載到內(nèi)存

結(jié)構(gòu)

  • BootstrapClassLoader:加載Java核心庫(JAVA_HOME/jre/lib),唯一一個(gè)使用本地代碼編寫的加載器
  • ExtensionClassLoader:加載擴(kuò)展庫(JAVA_HOME/jre/lib/ext和系統(tǒng)參數(shù)java.ext.dirs指定的目錄)卤档,它的父加載器是null(因?yàn)锽ootstrapClassLoader是使用C++實(shí)現(xiàn)的,沒有對(duì)應(yīng)的java類)
  • SystemClassLoader:加載應(yīng)用類的類文件(Classpath下的類文件)
  • UserDefineClassLoader:加載用戶定義的類文件抛虏,可以從網(wǎng)絡(luò)或者數(shù)據(jù)庫中加載類文件阳谍,實(shí)現(xiàn)類文件加密解密,動(dòng)態(tài)地創(chuàng)建符合應(yīng)用特殊需要的定制化類等
ClassLoader.png

雙親委派機(jī)制

加載器在接收到加載類的請求時(shí)郭卫,首先檢查自己的緩存战授,確認(rèn)類是否已被加載页藻,如果沒有加載,則將請求委托給父加載器植兰,依次遞歸份帐,如果父加載器完成加載,則成功返回楣导,否則才自己去加載

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
  // 檢查類是否已被加載
  Class c = findLoadedClass(name);
  if (c == null) {                
    try {
      if (parent != null) {
        // 委托父類去加載
        c = parent.loadClass(name, false);
      } else {
        // parent為空废境,代表父類是BootstrapClassLoader
        c = findBootstrapClassOrNull(name);
      }
    } catch (ClassNotFoundException e) {
      // ClassNotFoundException thrown if class not found
      // from the non-null parent class loader
    }

    if (c == null) {
      // 父類沒有加載,才自己去加載
      c = findClass(name);
    }
  }

  if (resolve) {
    resolveClass(c);
  }
  return c;
}

意義:避免重復(fù)加載爷辙,避免安全因素(如果不采用這種機(jī)制彬坏,那么系統(tǒng)核心的類就可以被隨意替換)

** 不同類加載器加載的類不是相同類型:在Java中朦促,一個(gè)類的全名(包名+類名)作為其標(biāo)識(shí)膝晾,但在JVM中,一個(gè)類用其全名+類加載器作為唯一標(biāo)識(shí)务冕,不同類加載器加載的類置于不同的命名空間中**

線程上下文類加載器

雙親委派模式不能解決全部的加載問題血当。
Java提供了很多服務(wù)提供者接口(Service Provider Interface,SPI)禀忆,常見的有JDBC臊旭、JNDI、JAXP等箩退。這些SPI接口由Java核心庫提供(通過BootstrapClassLoader加載)离熏,而它們的實(shí)現(xiàn)由第三方庫提供(通過SystemClassLoader加載)。但很多時(shí)候戴涝,SPI接口需要加載具體的實(shí)現(xiàn)類滋戳,如 JAXP 中的javax.xml.parsers.DocumentBuilderFactory類中的newInstance()方法用來生成一個(gè)新的DocumentBuilderFactory的實(shí)例钻蔑。這里的實(shí)例的真正的類是繼承自 javax.xml.parsers.DocumentBuilderFactory,由 SPI 的實(shí)現(xiàn)所提供的奸鸯。如在 Apache Xerces 中咪笑,實(shí)現(xiàn)的類是 org.apache.xerces.jaxp.DocumentBuilderFactoryImpl。問題是BootstrapClassLoader是無法找到 SPI 的實(shí)現(xiàn)類的娄涩,因?yàn)樗患虞d Java 的核心庫窗怒。它也不能代理給SystemClassLoader,因?yàn)樗荢ystemClassLoader的祖先類蓄拣。

而線程上下文類加載器就是解決這個(gè)問題扬虚,如果不做任何的設(shè)置,Java的線程的上下文類加載器默認(rèn)就是SystemClassLoader球恤。在SPI接口的代碼中使用線程上下文類加載器孔轴,就可以成功的加載到SPI實(shí)現(xiàn)的類。

使用線程上下文加載器碎捺,要注意保證多個(gè)需要通信的線程間的類加載器應(yīng)該是同一個(gè)路鹰,防止因?yàn)椴煌念惣虞d器導(dǎo)致類型轉(zhuǎn)換異常(ClassCastException)。

運(yùn)行時(shí)區(qū)域

運(yùn)行時(shí)區(qū)域

Method Area

已加載的類信息(類結(jié)構(gòu)收厨、方法晋柱、字段、靜態(tài)變量)
常量池:字符串诵叁、整形(-127-128)
一般稱為Permanent Generation

線程執(zhí)行

每個(gè)線程都有一個(gè)PC Register雁竞、JVM Stack、Native Method Stack
PC Register:下一條要執(zhí)行的指令的地址
JVM Stack:包含一系列的Stack Frame拧额,每次方法調(diào)用都會(huì)創(chuàng)建一個(gè)Frame并壓棧碑诉,每個(gè)棧幀都對(duì)應(yīng)一個(gè)被調(diào)用的方法(使用遞歸容易讓棧溢出,通過-Xss設(shè)置棧大薪慕酢)进栽。同時(shí)那些方法內(nèi)的局部變量,也是在這里創(chuàng)建


Stack Frame

Heap

Heap

存放實(shí)例對(duì)象和數(shù)組
分成Young恭垦、Tenured快毛、Permanent三個(gè)不同區(qū)域,其中Young又分成Eden和兩個(gè)相同大小的Survivor:From番挺、To
為什么要分代:不同對(duì)象的生命周期是不一樣的唠帝,采用不同的收集算法,可以提高回收效率

例子

public class Test {
  public static void main(String[] args) {
    public Test2 t2 = new Test2(); 
    //JVM將Test2類信息加載到方法區(qū),new Test2()實(shí)例保存在堆區(qū),Test2引用保存在棧區(qū)
  }
}

參考

http://docs.oracle.com/javase/specs/jvms/se7/jvms7.pdf
http://blog.csdn.net/zhoudaxia/article/details/35897057
http://www.ibm.com/developerworks/cn/java/j-lo-classloader/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末玄柏,一起剝皮案震驚了整個(gè)濱河市襟衰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粪摘,老刑警劉巖瀑晒,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阀湿,死亡現(xiàn)場離奇詭異,居然都是意外死亡瑰妄,警方通過查閱死者的電腦和手機(jī)陷嘴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來间坐,“玉大人灾挨,你說我怎么就攤上這事≈袼危” “怎么了劳澄?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜈七。 經(jīng)常有香客問我秒拔,道長,這世上最難降的妖魔是什么飒硅? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任砂缩,我火速辦了婚禮,結(jié)果婚禮上三娩,老公的妹妹穿的比我還像新娘庵芭。我一直安慰自己,他們只是感情好雀监,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布双吆。 她就那樣靜靜地躺著,像睡著了一般会前。 火紅的嫁衣襯著肌膚如雪好乐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天瓦宜,我揣著相機(jī)與錄音蔚万,去河邊找鬼。 笑死歉提,一個(gè)胖子當(dāng)著我的面吹牛笛坦,可吹牛的內(nèi)容都是我干的区转。 我是一名探鬼主播苔巨,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼废离!你這毒婦竟也來了侄泽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蜻韭,失蹤者是張志新(化名)和其女友劉穎悼尾,沒想到半個(gè)月后柿扣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡闺魏,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年未状,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片析桥。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡司草,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出泡仗,到底是詐尸還是另有隱情埋虹,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布娩怎,位于F島的核電站搔课,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏截亦。R本人自食惡果不足惜爬泥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望崩瓤。 院中可真熱鬧急灭,春花似錦、人聲如沸谷遂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肾扰。三九已至畴嘶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間集晚,已是汗流浹背窗悯。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偷拔,地道東北人蒋院。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像莲绰,于是被迫代替她去往敵國和親欺旧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評(píng)論 25 707
  • 一蛤签、JVM體系結(jié)構(gòu) JVM體系結(jié)構(gòu)分為4部分 類加載器辞友、執(zhí)行引擎、內(nèi)存區(qū)、本地方法調(diào)用 1. 類...
    onlinemf閱讀 390評(píng)論 0 1
  • 從三月份找實(shí)習(xí)到現(xiàn)在称龙,面了一些公司留拾,掛了不少,但最終還是拿到小米鲫尊、百度痴柔、阿里、京東疫向、新浪竞帽、CVTE、樂視家的研發(fā)崗...
    時(shí)芥藍(lán)閱讀 42,239評(píng)論 11 349
  • 人長長以為自己長情 以為自己戀舊 呵呵 只是現(xiàn)在過得不好罷了
    勵(lì)志名句閱讀 301評(píng)論 0 0
  • 經(jīng)常會(huì)接到一些電話鸿捧,360手機(jī)軟件會(huì)提示此號(hào)碼為詐騙電話屹篓。于是我在想,為什么會(huì)有這么多的詐騙電話匙奴?是騙子太多堆巧,還是...
    汀然Amily閱讀 1,379評(píng)論 0 1