.java文件會(huì)java編譯器生成Class文件述么。這個(gè)Class文件會(huì)被JVM虛擬機(jī)來處理。java虛擬機(jī)只與特定的二進(jìn)制文件,即Class文件有關(guān)帖旨。
類的生命周期
一個(gè)java文件被加載到j(luò)ava虛擬機(jī)內(nèi)存中到從內(nèi)存中卸載的過程被成為類的生命周期吩坝,他們的階段分別是
- 加載,查找并加載class文件
- 鏈接
驗(yàn)證 確保被導(dǎo)入類型的準(zhǔn)確性
準(zhǔn)備 為類的靜態(tài)字段分配字段,并用默認(rèn)值初始化這些字段
解析 將常量池內(nèi)的符號(hào)引用替換為直接引用 - 初始化 類變量
類加載
- 啟動(dòng)類加載器 Bootstrap Classloader冤竹,加載JDK核心類庫
- 擴(kuò)展類加載器 Extension ClassLoader,加載\lib\ext茬射,或者被java.ext.dirs系統(tǒng)變量指定的類
- 應(yīng)用程序類加載器鹦蠕,Application ClassLoader,加載ClassPath中的類庫
雙親委托模式
首先判斷該class文件是否已經(jīng)加載在抛,如果沒有加載钟病,委托父加載器去查找,直到最頂層bootstrap classloader刚梭。找到了就直接返回肠阱。該加載器的搜索范圍中沒有找到對(duì)應(yīng)的類,則依次鄉(xiāng)下查找。
好處:
- 可以避免重復(fù)加載
- 更安全.無法自定義string類替代系統(tǒng)的String類朴读。只有兩個(gè)類名一致屹徘,并被同一個(gè)類加載器加載的類,虛擬機(jī)才認(rèn)為他們是同一個(gè)類衅金。
android 的classloader
android的虛擬機(jī)加載的不是class噪伊,而是dex文件。android中的classloader分為兩類氮唯,系統(tǒng)類加載器鉴吹,自定義加載器。
- BootClassLoader 預(yù)加載常用類
- DexClassLoader 加載dex文件
- PathClassLoader 加載系統(tǒng)類和應(yīng)用程序類
DVM與JVM的區(qū)別
JVM基于棧則意味著需要去棧中讀寫數(shù)據(jù)惩琉,所需的指令會(huì)更多
DVM是基于寄存器的,Dalvik指令直接操作這些寄存器豆励,而不是訪問堆棧中的元素
DVM與ART區(qū)別
DVM中的應(yīng)用每次運(yùn)行時(shí),字節(jié)碼都需要通過即時(shí)編譯器(JIT瞒渠,just in time)轉(zhuǎn)換為機(jī)器碼良蒸,這會(huì)使得應(yīng)用的運(yùn)行效率降低。而在ART中在孝,系統(tǒng)在安裝應(yīng)用時(shí)會(huì)進(jìn)行一次預(yù)編譯(AOT诚啃,ahead of time),將字節(jié)碼預(yù)先編譯成機(jī)器碼并存儲(chǔ)在本地,這樣應(yīng)用每次運(yùn)行時(shí)就不需要執(zhí)行編譯了私沮,運(yùn)行效率也大大提升