虛擬機(jī)講解

一.java虛擬機(jī)結(jié)構(gòu)解析。

1.JVM整體結(jié)構(gòu)組成。

211701570812376.jpg

上圖就是JVM整體結(jié)構(gòu)圖,主要分為幾個模塊:
class 文件生成模塊:javac命令。
類加載器子系統(tǒng):將class字節(jié)碼加載到j(luò)vm對應(yīng)的虛擬機(jī)內(nèi)存中(核心就是ClassLoader),如下圖。
80a46038ad7f148edef4bd2116d2ed21.png

加載流程:
u=1093279780,2275276243&fm=27&gp=0.jpg

a.加載過程:類的信息從文件中獲取并且載入到虛擬機(jī)內(nèi)存中。
b.驗證過程:檢查讀入的結(jié)構(gòu)是否符合JVM規(guī)范的描述。
c.準(zhǔn)備過程:分配一個結(jié)構(gòu)用來存儲類信息。
d.解析過程:把這個類的常量池中的所有的符號引用改變?yōu)橹苯右谩?br> e.初始化過程:執(zhí)行靜態(tài)初始化程序,把靜態(tài)變量初始化為指定的值。
內(nèi)存空間:分為方法區(qū),堆區(qū),棧區(qū),本地方法棧。
a.Java棧區(qū):
作用:它存放的時Java方法執(zhí)行時的所有的數(shù)據(jù)。
組成:由棧幀組成,一個棧幀代表一個方法的執(zhí)行。
棧幀的作用:每個方法從調(diào)用到執(zhí)行完成就對應(yīng)一個棧幀在虛擬機(jī)棧中入棧到出
棧。
棧幀的組成:局部變量表、棧操作數(shù)、動態(tài)鏈接、方法出口。
b.本地方法棧:
作用:專門為Native方法服務(wù)的,其他和Java棧區(qū)一樣。
c.方法區(qū):
作用:存儲被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后等數(shù)
據(jù),方法區(qū)時是永遠(yuǎn)占據(jù)內(nèi)存的。
d.Java堆區(qū):
作用:所有通過new創(chuàng)建的對象的內(nèi)存都在堆中分配。
特點:是虛擬機(jī)中最大的一塊內(nèi)存,是GC要回收的部分。
堆區(qū)內(nèi)存結(jié)構(gòu)如下圖
711d886e93e98896da404492547382b6.jpg

Young Generation 新生代:新創(chuàng)建的對象會放到新生代區(qū)。
Old Generation 老生代:當(dāng)新生代內(nèi)存不足時,jvm虛擬機(jī)會通過一定的算法將新生代區(qū)的對象移到老生代區(qū)中,當(dāng)老生代和新生代都沒有足夠的內(nèi)存時就會拋出oom異常。
jvm為什么要將堆區(qū)這塊內(nèi)存分為新生代和老生代呢,為什么不是一塊內(nèi)存?
可以讓開發(fā)人員去動態(tài)的調(diào)整Young Generation區(qū)域的大小和Old Generation區(qū)域的大小,比如說我們在做一些即時通訊應(yīng)用的java服務(wù)器的時候,可能創(chuàng)建一些message對象這種臨時消息比較多,我們可以將新生代內(nèi)存區(qū)域調(diào)整的大一些,老生代內(nèi)存區(qū)域調(diào)整的小一些,這樣便于我們的內(nèi)存分配,也可以加快對象的創(chuàng)建,而我們要開發(fā)大型服務(wù)類程序的話,可能不需要頻繁創(chuàng)建對象,這時候我們就可以適當(dāng)減少新生代的內(nèi)存區(qū)域,增加老生代內(nèi)存區(qū),達(dá)到對象常駐內(nèi)存效果。
垃圾收集器:所謂的gc。
3.如何確定某個對象是垃圾。
a.引用計數(shù)算法:我們在內(nèi)存中創(chuàng)建一個對象的時候,同時為它產(chǎn)生一個引用計
數(shù)器,同時將引用計數(shù)器加1,每當(dāng)有新的引用引用到此對象的時候,引用計數(shù)
器就累計加1,而當(dāng)其中的一個引用銷毀的時候,引用計數(shù)器就減1,當(dāng)引用計
數(shù)器減為0的時候,標(biāo)志著對象已經(jīng)是垃圾對象了,可以被垃圾回收器回收。
缺陷:循環(huán)引用。
b.可達(dá)性分析:將所有的引用關(guān)系看作一個圖,從gcroot節(jié)點開始尋找所有對應(yīng)
的引用節(jié)點,找到節(jié)點以后繼續(xù)尋找該節(jié)點的引用,當(dāng)所有的引用節(jié)點尋找完畢
之后,剩余的節(jié)點則被認(rèn)為是沒有被引用的節(jié)點,即不可達(dá)的節(jié)點,即垃圾對
象,避免了循環(huán)引用。如圖
52b0817a68a45313cf0eb4ce9fdbebd8.jpg

4.引用類型
強(qiáng)引用、弱引用、軟引用、虛引用,常用的是強(qiáng)引用和弱引用。
弱引用的創(chuàng)建:

   Object obj = new Object();
   WeakReference<Object> wf = new WeakReference<Object>(obj);
    obj = null;
    wf.get();

首先創(chuàng)建一個強(qiáng)引用obj,然后創(chuàng)建object的弱引用wf,所已我們的Object對象有兩個引用指向了它,一個是obj,一個是wf,我們把obj置為null,所以只有wf指向了Object對象,wf.get()時要判斷獲取的引用是否為null,因為弱引用是不會阻礙垃圾回收。
5.垃圾回收算法
a.標(biāo)記-清除算法:如圖

596ea6675514117f8998839de57d4013.jpeg

首先從根集合即根節(jié)點來遍歷所有的引用,可以路由到A對象的引用,由A對象
可以路由到C對象的引用,而B對象成為不可達(dá)的引用,B就會被標(biāo)記成可回收對
象。
好處:不需要進(jìn)行對象的移動,并且僅對不存活的對象進(jìn)行處理,在存活對象多
的情況下極為高效。
缺點:因為標(biāo)記清除算法會直接清除不存活的對象,因此會造成內(nèi)存碎片
b.復(fù)制算法:如圖
5dbb48c91f32d71046e6aaf5b12501f2.jpg

也是從根節(jié)點開始遍歷,遍歷到A引用是可達(dá)的,那么就會把A引用復(fù)制到另一
塊空閑的內(nèi)存,B引用是不可達(dá)的,它就直接跳過不去復(fù)制,C是可達(dá)的,直接
復(fù)制到空閑內(nèi)存中,遍歷完后會把原來的內(nèi)存空間清空。
優(yōu)勢:當(dāng)存活的對象比較少時極為高效 。
缺點:需要一塊內(nèi)存空間來做交換移動。
c.標(biāo)記-整理算法:如圖
6e4af306dc6d24ed61a30174fab73040.jpg

首先也是從根集合開始遍歷,通過對內(nèi)存區(qū)的掃描,會把可回收的內(nèi)存掃描出來,從圖中可以看出,第二階段B內(nèi)存已經(jīng)被掃描出來了,第三階段掃描整個內(nèi)存空間并清除可回收對象,標(biāo)記-整理算法是在標(biāo)記-清除算法上做了改進(jìn),在回收不存活對象占用的空間的時候,會將所有存活對象向左空閑空間處移動,并更新對應(yīng)的指針,相比較標(biāo)記-清除算法成本更高,卻解決了內(nèi)存碎片問題。
這三種算法各有優(yōu)劣,是在我們虛擬機(jī)中結(jié)合使用的。
6.觸發(fā)回收
a.Java虛擬機(jī)無法再為新的對象分配內(nèi)存空間了。
b.手動調(diào)用System.gc()方法(不推薦 )
c.低優(yōu)先級的GC線程被運行時就會執(zhí)行GC。

二.Dalvik與JVM的不同。

1.執(zhí)行的文件不同,一個是class,一個是dex。
2.類加載系統(tǒng)不同。
3.JVM只可以存在一個,Dalvik可以存在多個(好處:某個應(yīng)用的虛擬機(jī)掛掉之后
不會影響其他應(yīng)用的運行)。
4.Dalvik是基于寄存器(更快 )的,JVM是基于棧的。

三.ART比Dalvik有哪些優(yōu)勢。

1.Dalvik使用JIT來將字節(jié)碼轉(zhuǎn)換為機(jī)器碼,效率低,JIT技術(shù)就是應(yīng)用每次運行的
時候 都會將字節(jié)碼轉(zhuǎn)化為本地機(jī)器碼,再去執(zhí)行,一旦退出應(yīng)用再次進(jìn)入時,就
要重新轉(zhuǎn)化 ,效率低。
2.ART采用了AOT預(yù)編譯技術(shù),執(zhí)行速度更快。AOT就是在我們應(yīng)用程序安裝的
時候就將我們的字節(jié)碼轉(zhuǎn)換成了本地機(jī)器碼 ,保存在存儲介質(zhì)中,這樣應(yīng)用程序
不管何時啟動,都是執(zhí)行的本地機(jī)器碼 ,不需要每次都轉(zhuǎn)換 ,但是ART會占用
更多的應(yīng)用安裝時間和存儲空間(用空間換時間)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容