JVM系列一:Java虚拟机与操作系统结构比较
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
在了解jvm的結(jié)構(gòu)之前,我們有必要先來了解一下操作系統(tǒng)的內(nèi)存基本結(jié)構(gòu):
操作系統(tǒng)中的jvm
為什么jvm的內(nèi)存是分布在操作系統(tǒng)的堆中呢??因?yàn)椴僮飨到y(tǒng)的棧是操作系統(tǒng)管理的,它隨時(shí)會被回收,所以如果jvm放在棧中,那java的一個(gè)null對象就很難確定會被誰回收了,那gc的存在就一點(diǎn)意義都沒有了,而要對棧做到自動釋放也是jvm需要考慮的,所以放在堆中就最合適不過了。 操作系統(tǒng)+jvm的內(nèi)存簡單布局
從上圖中,你可以看到,jvm的內(nèi)存結(jié)構(gòu)居然和操作系統(tǒng)的結(jié)構(gòu)驚人的一致,再來看一個(gè)圖。看我下面紅色的標(biāo)注
你應(yīng)該不難發(fā)現(xiàn),原來jvm的設(shè)計(jì)的模型其實(shí)就是操作系統(tǒng)的模型,基于操作系統(tǒng)的角度,jvm也就是一個(gè)應(yīng)用(java.exe/javaw.exe),而基于class文件來說,jvm就是個(gè)操作系統(tǒng),而jvm的方法區(qū),也就相當(dāng)于操作系統(tǒng)的硬盤區(qū),所以方法區(qū)也被叫做permanent區(qū),因?yàn)檫@個(gè)單詞是永久的意思,也就是永久區(qū)。而java棧和操作系統(tǒng)棧是一致的,無論是生長方向還是管理的方式,至于堆嘛,雖然概念上一致目標(biāo)也一致,分配內(nèi)存的方式也一直(new,或者malloc等等),但是由于他們的管理方式不同,jvm是gc回收,而操作系統(tǒng)是程序員手動釋放,所以在算法上有很多的差異. 看下面的圖。
將這個(gè)圖和上面的圖對比多了什么?沒錯(cuò),多了一個(gè)pc寄存器,所謂pc寄存器,無論是在虛擬機(jī)中還是在我們虛擬機(jī)所寄宿的操作系統(tǒng)中功能目的是一致的,計(jì)算機(jī)上的pc寄存器是計(jì)算機(jī)上的硬件,本來就是屬于計(jì)算機(jī),計(jì)算機(jī)用pc寄存器來存放“偽指令”或地址,而相對于虛擬機(jī),pc寄存器它表現(xiàn)為一塊內(nèi)存(一個(gè)字長,虛擬機(jī)要求字長最小為32位),虛擬機(jī)的pc寄存器的功能也是存放偽指令,更確切的說存放的是將要執(zhí)行指令的地址,它甚至可以是操作系統(tǒng)指令的本地地址,當(dāng)虛擬機(jī)正在執(zhí)行的方法是一個(gè)本地方法的時(shí)候,jvm的pc寄存器存儲的值是undefined,所以你現(xiàn)在應(yīng)該很明確的知道,虛擬機(jī)的pc寄存器是用于存放下一條將要執(zhí)行的指令的地址(字節(jié)碼流)。
這個(gè)圖是要告訴你,當(dāng)一個(gè)classLoder啟動的時(shí)候,classLoader的生存地點(diǎn)在jvm中的堆,然后它會去主機(jī)硬盤上將A.class裝載到j(luò)vm的方法區(qū),方法區(qū)中的這個(gè)字節(jié)文件會被虛擬機(jī)拿來new A字節(jié)碼(),然后在堆內(nèi)存生成了一個(gè)A字節(jié)碼的對象,然后A字節(jié)碼這個(gè)內(nèi)存文件有兩個(gè)引用一個(gè)指向A的class對象,一個(gè)指向加載自己的classLoader
如下圖。
轉(zhuǎn)載于:https://my.oschina.net/aptx4869/blog/324170
總結(jié)
以上是生活随笔為你收集整理的JVM系列一:Java虚拟机与操作系统结构比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [UML]UML系列——用例图Use C
- 下一篇: 【转载】JS获取浏览器版本信息