JVM類加載機(jī)制

JVM類結(jié)構(gòu)類加載類執(zhí)行

image.png

image.png

類加載的五個(gè)過程:加載、驗(yàn)證枫笛、準(zhǔn)備、解析往枣、初始化进胯。

  • 加載: 根據(jù)全限定名來獲取定義類的二進(jìn)制字節(jié)流,然后將該字節(jié)流所代表的靜態(tài)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),最后在生成一個(gè)代表該類的Class對(duì)象,作為方法區(qū)這些數(shù)據(jù)的訪問入口.
  • 驗(yàn)證:主要時(shí)為了確保class文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會(huì)危害虛擬機(jī)自身的安全.包含四個(gè)階段的驗(yàn)證過程:
  1. 文件格式驗(yàn)證:保證輸入的字節(jié)流能夠正確地解析并存儲(chǔ)在方法區(qū)之內(nèi),格式上符合描述一個(gè)java類型信息的要求
  2. 元數(shù)據(jù)驗(yàn)證:字節(jié)碼語(yǔ)義信息的驗(yàn)證,以保證描述的信息符合java語(yǔ)言規(guī)范.驗(yàn)證點(diǎn)有:這個(gè)類是否有父類等.
  3. 字節(jié)碼驗(yàn)證:主要是進(jìn)行數(shù)據(jù)流和控制流分析,保證被校驗(yàn)類的方法在運(yùn)行時(shí)不會(huì)做出危害虛擬機(jī)安全的行為.
  4. 符號(hào)引用驗(yàn)證:對(duì)符號(hào)引用轉(zhuǎn)化為直接引用過程的驗(yàn)證.
  • 準(zhǔn)備:為類變量分配內(nèi)存并設(shè)置變量的初始值, 這些內(nèi)存在方法區(qū)進(jìn)行分配.
  • 解析:將虛擬機(jī)常量池中的符號(hào)引用轉(zhuǎn)化為直接引用的過程.解析主要是針對(duì)類或接口、字段原押、類方法胁镐、類接口方法四類.
  • 初始化:執(zhí)行靜態(tài)變量的賦值操作以及靜態(tài)代碼塊,完成初識(shí)化.初始化過程保證了父類中定義的初始化優(yōu)先于子類的初始化.但接口不需要執(zhí)行父類的初始化.

類初始化階段解析

https://blog.csdn.net/ns_code/article/details/17881581

類變量初始化順序

https://blog.csdn.net/jianggujin/article/details/52228983

類class文件解析

https://blog.csdn.net/ns_code/article/details/17675609

JVM類加載時(shí)機(jī)

  • 何時(shí)開始類的初始化
    什么情況下需要開始類加載過程的第一個(gè)階段:"加載"。虛擬機(jī)規(guī)范中并沒強(qiáng)行約束诸衔,這點(diǎn)可以交給虛擬機(jī)的的具體實(shí)現(xiàn)自由把握盯漂,但是對(duì)于初始化階段虛擬機(jī)規(guī)范是嚴(yán)格規(guī)定了如下幾種情況,如果類未初始化會(huì)對(duì)類進(jìn)行初始化笨农。
  1. 創(chuàng)建類的實(shí)例
  2. 訪問類的靜態(tài)變量(除常量【被final修辭的靜態(tài)變量】原因:常量一種特殊的變量就缆,因?yàn)榫幾g器把他們當(dāng)作值(value)而不是域(field)來對(duì)待。如果你的代碼中用到了常變量(constant variable)谒亦,編譯器并不會(huì)生成字節(jié)碼來從對(duì)象中載入域的值竭宰,而是直接把這個(gè)值插入到字節(jié)碼中空郊。這是一種很有用的優(yōu)化,但是如果你需要改變final域的值那么每一塊用到那個(gè)域的代碼都需要重新編譯切揭。
  3. 訪問類的靜態(tài)方法
  4. 反射如(Class.forName("my.xyz.Test"))
  5. 當(dāng)初始化一個(gè)類時(shí)狞甚,發(fā)現(xiàn)其父類還未初始化,則先出發(fā)父類的初始化
  6. 虛擬機(jī)啟動(dòng)時(shí)廓旬,定義了main()方法的那個(gè)類先初始化
    以上情況稱為稱對(duì)一個(gè)類進(jìn)行“主動(dòng)引用”哼审,除此種情況之外,均有且僅有這幾種情況不會(huì)觸發(fā)類的初始化孕豹,稱為“被動(dòng)引用”
    接口的加載過程與類的加載過程稍有不同涩盾。接口中不能使用static{}塊。當(dāng)一個(gè)接口在初始化時(shí)励背,并不要求其父接口全部都完成了初始化春霍,只有真正在使用到父接口時(shí)(例如引用接口中定義的常量)才會(huì)初始化。
  • 被動(dòng)引用例子
  1. 子類調(diào)用父類的靜態(tài)變量椅野,子類不會(huì)被初始化终畅。只有父類被初始化。竟闪。對(duì)于靜態(tài)字段离福,只有直接定義這個(gè)字段的類才會(huì)被初始化.
  2. 通過數(shù)組定義來引用類,不會(huì)觸發(fā)類的初始化
    SubClass[] sca = new SubClass[10];// 被動(dòng)引用2
  3. 訪問類的常量炼蛤,不會(huì)初始化類

具體可參考 https://www.cnblogs.com/javaee6/p/3714716.html

JVM 加載 class 文件的原理機(jī)制

JVM 中類的裝載是由類加載器(ClassLoader) 和它的子類來實(shí)現(xiàn)的妖爷,Java 中的類加載器是一個(gè)重要的 Java 運(yùn)行時(shí)系統(tǒng)組件,它負(fù)責(zé)在運(yùn)行時(shí)查找和裝入類文件中的類理朋。
由于 Java 的跨平臺(tái)性絮识,經(jīng)過編譯的 Java 源程序并不是一個(gè)可執(zhí)行程序,而是一個(gè)或多個(gè)類文件嗽上。當(dāng) Java 程序需要使用某個(gè)類時(shí)次舌,JVM 會(huì)確保這個(gè)類已經(jīng)被加載、連接(驗(yàn)證兽愤、準(zhǔn)備和解析)和初始化彼念。類的加載是指把類的 .class 文件中的數(shù)據(jù)讀入到內(nèi)存中,通常是創(chuàng)建一個(gè)字節(jié)數(shù)組讀入 .class 文件浅萧,然后產(chǎn)生與所加載類對(duì)應(yīng)的 Class 對(duì)象逐沙。加載完成后,Class 對(duì)象還不完整洼畅,所以此時(shí)的類還不可用吩案。當(dāng)類被加載后就進(jìn)入連接階段,這一階段包括驗(yàn)證帝簇、準(zhǔn)備(為靜態(tài)變量分配內(nèi)存并設(shè)置默認(rèn)的初始值)和解析(將符號(hào)引用替換為直接引用)三個(gè)步驟徘郭。最后 JVM 對(duì)類進(jìn)行初始化靠益,包括:

  1. 如果類存在直接的父類并且這個(gè)類還沒有被初始化,那么就先初始化父類崎岂;
  2. 如果類中存在初始化語(yǔ)句捆毫,就依次執(zhí)行這些初始化語(yǔ)句。
    類的加載是由類加載器完成的冲甘,類加載器包括:?jiǎn)?dòng)類加載器(BootStrap)绩卤、擴(kuò)展加載器(Extension)、應(yīng)用程序加載器(Application)和用戶自定義類加載器(java.lang.ClassLoader的子類)江醇。從JDK 1.2開始濒憋,類加載過程采取了父親委托機(jī)制(PDM)。PDM 更好的保證了 Java 平臺(tái)的安全性陶夜,在該機(jī)制中凛驮,JVM 自帶的 Bootstrap 是根加載器,其他的加載器都有且僅有一個(gè)父類加載器条辟。類的加載首先請(qǐng)求父類加載器加載黔夭,父類加載器無能為力時(shí)才由其子類加載器自行加載。JVM 不會(huì)向 Java 程序提供對(duì) Bootstrap 的引用羽嫡。下面是關(guān)于幾個(gè)類加載器的說明:
  • Bootstrap:?jiǎn)?dòng)類加載器本姥,一般用本地代碼實(shí)現(xiàn),負(fù)責(zé)加載JVM基礎(chǔ)核心類庫(kù)杭棵。加載存放在<JAVA_HOME>/lib目錄中的類庫(kù)(如rt.jar)婚惫;
  • Extension ClassLoader:擴(kuò)展加載器, 負(fù)責(zé)加載<JAVA_HOME>/lib/ext目錄中的 魂爪,或被java.ext.dirs 系統(tǒng)屬性所指定的目錄中加載類庫(kù)先舷,它的父加載器是 Bootstrap;
  • Application ClassLoader:應(yīng)用程序加載器滓侍,其父類是Extension蒋川。它是應(yīng)用最廣泛的類加載器。它從環(huán)境變量 classpath 或者系統(tǒng)屬性 java.class.path 所指定的目錄中記載類撩笆,是用戶自定義加載器的默認(rèn)父加載器尔破。

缺點(diǎn):

  • 雙親委派模型很好地解決了各個(gè)類加載器的基礎(chǔ)類統(tǒng)一問題(越基礎(chǔ)的類由越上層的加載器進(jìn)行加載),基礎(chǔ)類之所以被稱為“基礎(chǔ)”浇衬,是因?yàn)樗鼈兛偸亲鳛楸徽{(diào)用代碼調(diào)用的API。但是餐济,如果基礎(chǔ)類又要調(diào)用用戶的代碼時(shí)耘擂,雙親委派模型無法滿足要求。 因?yàn)锽ootstrap加載器無法找到永不代碼類絮姆。

為了解決這個(gè)困境醉冤,Java設(shè)計(jì)團(tuán)隊(duì)只好引入了一個(gè)不太優(yōu)雅的設(shè)計(jì):線程上下文件類加載器(Thread Context ClassLoader)秩霍。這個(gè)類加載器可以通過java.lang.Thread類的setContextClassLoader()方法進(jìn)行設(shè)置,如果創(chuàng)建線程時(shí)還未設(shè)置蚁阳,它將會(huì)從父線程中繼承一個(gè)铃绒;如果在應(yīng)用程序的全局范圍內(nèi)都沒有設(shè)置過,那么這個(gè)類加載器默認(rèn)就是應(yīng)用程序類加載器螺捐。了有線程上下文類加載器颠悬,JNDI服務(wù)使用這個(gè)線程上下文類加載器去加載所需要的SPI代碼,也就是父類加載器請(qǐng)求子類加載器去完成類加載動(dòng)作定血,這種行為實(shí)際上就是打通了雙親委派模型的層次結(jié)構(gòu)來逆向使用類加載器赔癌,已經(jīng)違背了雙親委派模型,但這也是無可奈何的事情澜沟。Java中所有涉及SPI的加載動(dòng)作基本上都采用這種方式灾票,例如JNDI,JDBC,JCE,JAXB和JBI等。 Dubbo的SPI也是采用這種機(jī)制實(shí)現(xiàn)茫虽。

雙親委派模型

除了頂層的啟動(dòng)類加載器外,其余的類加載器都應(yīng)當(dāng)有自己的父類加載器.順序依次是:

  • Bootstrap ClassLoader: 啟動(dòng)類加載器,加載java_home/lib中的類
  • Extension ClassLoader: 擴(kuò)展類加載器,加載java_home/lib/ext目錄下的類庫(kù)
  • Application ClassLoader: 應(yīng)用程序類加載器,加載用戶類路徑上指定類庫(kù).

雙親委派模型的工作原理是:如果一個(gè)類加載器受到了類加載請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類,而把這個(gè)請(qǐng)求委派給父類加載器去完成,每一層次的類加載器都是如此,因此所有的加載請(qǐng)求最終都應(yīng)該傳送到頂層的啟動(dòng)類加載器中,只有當(dāng)父類加載器反饋?zhàn)约簾o法完成加載請(qǐng)求時(shí),加載器才嘗試自己加載.這種方式保證了Oject類(JDK 核心類)在各個(gè)加載器加載環(huán)境中都是同一個(gè)類.

分派:靜態(tài)分派與動(dòng)態(tài)分派刊苍。

多態(tài)性特征的一些最基本的體現(xiàn). 靜態(tài)類型是編譯期可知的,動(dòng)態(tài)類型是在運(yùn)行時(shí)可知.Human h =new Man(); Human是靜態(tài)類型,Man時(shí)動(dòng)態(tài)類型.

所有依賴于靜態(tài)類型定位方法執(zhí)行版本的分派動(dòng)作稱作靜態(tài)分派,最典型的應(yīng)用是方法重載.靜態(tài)分派發(fā)生在編譯階段

動(dòng)態(tài)分派是根據(jù)動(dòng)態(tài)類型來確定執(zhí)行的版本,所以只有到運(yùn)行時(shí)才能確定具體的執(zhí)行方法版本.典型的代表時(shí)重寫.其過程如下:

  1. 首先找到操作數(shù)棧棧頂?shù)牡谝粋€(gè)元素所執(zhí)向?qū)ο蟮膶?shí)際類型,記做C.
  2. 如果在類型C中找到和常量中的描述符和簡(jiǎn)單名稱都相符的方法,則進(jìn)行范圍權(quán)限校驗(yàn).如果通過則返回該方法的直接引用,否則拋出IllegalAccessError異常.
  3. 否則按照繼承關(guān)系從下往上一次對(duì)C的各個(gè)父類進(jìn)行第2步的搜索和驗(yàn)證過程.
  4. 如果始終沒有找到就拋出AbstractMethodError異常. 方法的接受者和方法的參數(shù)統(tǒng)稱方法宗量,根據(jù)分配基于多少中宗量可以分為單分派和多分派.java是靜態(tài)多分派,動(dòng)態(tài)分派屬于單分派.

動(dòng)態(tài)分派的實(shí)現(xiàn): 動(dòng)態(tài)分派時(shí)非常頻繁的動(dòng)作,而且動(dòng)態(tài)分派的方法版本選擇過程需要運(yùn)行時(shí)在類的方法元數(shù)據(jù)中搜索合適的目標(biāo)方法,因此出于性能的考慮,在方法區(qū)中建立一個(gè)虛方法表,用來保存各個(gè)方法的實(shí)際入口地址.如果某個(gè)方法的子類中沒有被重寫,那么子類的虛方法表里面的地址入口和父類相同方法的地址入口是一致的.都是指向父類的實(shí)現(xiàn)入口,如果子類中重寫了這個(gè)方法,子類方法表中的地址將會(huì)被替換為指向子類實(shí)現(xiàn)版本的入口地址.虛方法表在類加載的連接階段進(jìn)行初始化.

Student s= new Student(),在內(nèi)存中做了那些事情

  1. 加載Student.class 文件進(jìn)內(nèi)存
  2. 在棧內(nèi)存為s開辟空間
  3. 在堆內(nèi)存為Student對(duì)象開辟空間
  4. 學(xué)生對(duì)象的成員變量進(jìn)行顯示初始化
  5. 通過構(gòu)造方法對(duì)學(xué)生對(duì)象變量賦值
  6. 學(xué)生對(duì)象初始完畢濒析,把對(duì)象地址賦值給s變量

相關(guān)資料: http://blog.csdn.net/wisgood/article/details/16818243

Java對(duì)象正什,類存在形式

Java雙親委派模型及破壞

https://blog.csdn.net/zhangcanyan/article/details/78993959

雙親委派模型的式作過程是:如果一個(gè)類加載器收到了類加載的請(qǐng)求,它首先不會(huì)自己去嘗試加載這個(gè)類悼枢,而是把這個(gè)請(qǐng)求委派給父類加載器去完成埠忘,每一個(gè)層次的類加載器都是如此,因此所有的加載請(qǐng)求最終都應(yīng)該傳送到頂層的啟動(dòng)類加載器中馒索,只有當(dāng)父加載器反饋?zhàn)约簾o法完全這個(gè)加載請(qǐng)求時(shí)莹妒,子加載器才會(huì)嘗試自己去加載。

雙親委派模型的破壞
雙親委派模型的第一次“被破壞”其實(shí)發(fā)生在雙親委派模型出現(xiàn)之前--即JDK1.2發(fā)布之前绰上。由于雙親委派模型是在JDK1.2之后才被引入的旨怠,而類加載器和抽象類java.lang.ClassLoader則是JDK1.0時(shí)候就已經(jīng)存在,面對(duì)已經(jīng)存在 的用戶自定義類加載器的實(shí)現(xiàn)代碼蜈块,Java設(shè)計(jì)者引入雙親委派模型時(shí)不得不做出一些妥協(xié)鉴腻。為了向前兼容,JDK1.2之后的java.lang.ClassLoader添加了一個(gè)新的proceted方法findClass()百揭,在此之前爽哎,用戶去繼承java.lang.ClassLoader的唯一目的就是重寫loadClass()方法,因?yàn)樘摂M在進(jìn)行類加載的時(shí)候會(huì)調(diào)用加載器的私有方法loadClassInternal()器一,而這個(gè)方法的唯一邏輯就是去調(diào)用自己的loadClass()课锌。JDK1.2之后已不再提倡用戶再去覆蓋loadClass()方法,應(yīng)當(dāng)把自己的類加載邏輯寫到findClass()方法中,在loadClass()方法的邏輯里渺贤,如果父類加載器加載失敗雏胃,則會(huì)調(diào)用自己的findClass()方法來完成加載,這樣就可以保證新寫出來的類加載器是符合雙親委派模型的志鞍。
雙親委派模型的第二次“被破壞”是這個(gè)模型自身的缺陷所導(dǎo)致的瞭亮,雙親委派模型很好地解決了各個(gè)類加載器的基礎(chǔ)類統(tǒng)一問題(越基礎(chǔ)的類由越上層的加載器進(jìn)行加載),基礎(chǔ)類之所以被稱為“基礎(chǔ)”固棚,是因?yàn)樗鼈兛偸亲鳛楸徽{(diào)用代碼調(diào)用的API统翩。但是,如果基礎(chǔ)類又要調(diào)用用戶的代碼玻孟,那該怎么辦呢唆缴。
這并非是不可能的事情,一個(gè)典型的例子便是JNDI服務(wù)黍翎,它的代碼由啟動(dòng)類加載器去加載(在JDK1.3時(shí)放進(jìn)rt.jar)面徽,但JNDI的目的就是對(duì)資源進(jìn)行集中管理和查找,它需要調(diào)用獨(dú)立廠商實(shí)現(xiàn)部部署在應(yīng)用程序的classpath下的JNDI接口提供者(SPI, Service Provider Interface)的代碼匣掸,但啟動(dòng)類加載器不可能“認(rèn)識(shí)”之些代碼趟紊,該怎么辦?
為了解決這個(gè)困境碰酝,Java設(shè)計(jì)團(tuán)隊(duì)只好引入了一個(gè)不太優(yōu)雅的設(shè)計(jì):線程上下文件類加載器(Thread Context ClassLoader)霎匈。這個(gè)類加載器可以通過java.lang.Thread類的setContextClassLoader()方法進(jìn)行設(shè)置,如果創(chuàng)建線程時(shí)還未設(shè)置送爸,它將會(huì)從父線程中繼承一個(gè)铛嘱;如果在應(yīng)用程序的全局范圍內(nèi)都沒有設(shè)置過,那么這個(gè)類加載器默認(rèn)就是應(yīng)用程序類加載器袭厂。了有線程上下文類加載器墨吓,JNDI服務(wù)使用這個(gè)線程上下文類加載器去加載所需要的SPI代碼,也就是父類加載器請(qǐng)求子類加載器去完成類加載動(dòng)作纹磺,這種行為實(shí)際上就是打通了雙親委派模型的層次結(jié)構(gòu)來逆向使用類加載器帖烘,已經(jīng)違背了雙親委派模型,但這也是無可奈何的事情橄杨。Java中所有涉及SPI的加載動(dòng)作基本上都采用這種方式秘症,例如JNDI,JDBC,JCE,JAXB和JBI等。
雙親委派模型的第三次“被破壞”是由于用戶對(duì)程序的動(dòng)態(tài)性的追求導(dǎo)致的式矫,例如OSGi的出現(xiàn)乡摹。在OSGi環(huán)境下,類加載器不再是雙親委派模型中的樹狀結(jié)構(gòu)采转,而是進(jìn)一步發(fā)展為網(wǎng)狀結(jié)構(gòu)趟卸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锄列,更是在濱河造成了極大的恐慌,老刑警劉巖惯悠,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻邮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡克婶,警方通過查閱死者的電腦和手機(jī)筒严,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來情萤,“玉大人鸭蛙,你說我怎么就攤上這事〗畹海” “怎么了娶视?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)睁宰。 經(jīng)常有香客問我肪获,道長(zhǎng),這世上最難降的妖魔是什么柒傻? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任孝赫,我火速辦了婚禮,結(jié)果婚禮上红符,老公的妹妹穿的比我還像新娘青柄。我一直安慰自己,他們只是感情好预侯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布致开。 她就那樣靜靜地躺著,像睡著了一般雌桑。 火紅的嫁衣襯著肌膚如雪喇喉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天校坑,我揣著相機(jī)與錄音拣技,去河邊找鬼。 笑死耍目,一個(gè)胖子當(dāng)著我的面吹牛膏斤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播邪驮,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼莫辨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起沮榜,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盘榨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蟆融,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體草巡,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年型酥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了山憨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弥喉,死狀恐怖郁竟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情由境,我是刑警寧澤棚亩,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站藻肄,受9級(jí)特大地震影響蔑舞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嘹屯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一攻询、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧州弟,春花似錦钧栖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至啃奴,卻和暖如春潭陪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背最蕾。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工依溯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瘟则。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓黎炉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親醋拧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慷嗜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

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

  • JVM類加載機(jī)制 概述 類加載過程 加載 通過類的全限定名獲取類的二進(jìn)制流 將靜態(tài)存儲(chǔ)結(jié)構(gòu)轉(zhuǎn)化為方法區(qū)的運(yùn)行時(shí)數(shù)據(jù)...
    東溪95閱讀 3,025評(píng)論 0 15
  • 虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存淀弹,并對(duì)數(shù)據(jù)進(jìn)行校驗(yàn)、轉(zhuǎn)換解析和初始化庆械,最終形成可以被虛擬機(jī)直接使用的...
    丑人林宗己閱讀 567評(píng)論 0 2
  • 所謂類加載機(jī)制薇溃,就是虛擬機(jī)把描述類的數(shù)據(jù)從Class文件加載到內(nèi)存中,并對(duì)其進(jìn)行校驗(yàn)干奢,轉(zhuǎn)換痊焊,分析以及初始化,并最終...
    登高且賦閱讀 1,181評(píng)論 0 15
  • 表妹懷孕兩個(gè)月忿峻,妊娠反應(yīng)很強(qiáng)烈,吃什么吐什么辕羽,婆家的菜她吃不習(xí)慣逛尚,說自己最想念外婆做的醬油蒸蛋。我說醬油蒸蛋有什么...
    豐帆閱讀 1,064評(píng)論 8 12
  • 夢(mèng)里下了一場(chǎng)雨 文/雅 雷聲 喚醒昔日的記憶 閃電劃過 思念的天空 一滴滴的諾言 沿著心窗滑落 落在故鄉(xiāng) 落在家門...
    sweet寶寶閱讀 172評(píng)論 0 1