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