新聞中心
jvm工作原理是什么?
JVM中的內存分為五個部分:

(1)方法區(qū):存儲加載的class字節(jié)碼,通過該區(qū)域我們能尋址到類中的方法的入口。除此之外,方法區(qū)還包括運行時常量區(qū)和靜態(tài)常量區(qū)。這個區(qū)域是所有線程共享的。
(2)堆:存儲new出來的對象,垃圾回收器主要監(jiān)控和回收的就是這塊區(qū)域。在堆里面不斷創(chuàng)建對象但是垃圾回收器不回收,就有可能造成OutOfMemoryError錯誤。這個區(qū)域也是線程共享的。
(3)虛擬機棧:存儲所有被調用的java方法的上下文。在main方法里面調用test方法,則在虛擬機棧里面push進test方法上下文,調用完畢,則pop出test方法的上下文。倘若在main方法里面遞歸調用main方法,則虛擬機棧則會被消耗光資源,造成StackOverflowError錯誤。這個區(qū)域是線程隔離的,也就是說每個線程都有一個虛擬機棧。
(4)本地方法棧:本地方法棧與虛擬機棧類似,只不過本地方法棧中存儲所有被調用的本地native方法的上下文。這個區(qū)域也是線程隔離的。
(5)程序計數(shù)器:存儲著CPU下一條指令的地址,也就是說記錄著現(xiàn)在程序執(zhí)行到了哪里,執(zhí)行到了那條語句,哪個指令。這個區(qū)域也是線程隔離的。
jvm同時啟動兩個進程會有兩個堆嘛?
JVM同時啟動兩個進程會有兩個堆。每個進程都會有自己的JVM實例,每個JVM實例都會有自己的堆。堆是JVM中的一個內存區(qū)域,用于存儲運行時創(chuàng)建的對象。每個JVM實例都會有自己的堆,這是因為每個進程都會獨立運行,互相之間不會共享內存。因此,兩個JVM實例啟動時,就會有兩個獨立的堆。這樣可以保證進程之間的數(shù)據(jù)獨立性,避免相互干擾。
是的,一般來說,每個進程是擁有自己獨立的存儲空間,那怕它們是同一個程序的多次執(zhí)行。 但其實每個進程所占用的空間其實包含了代碼段,數(shù)據(jù)段,堆棧段等。這些用途不同的存儲空間是可以分別進行管理的,這也是段式內存管理的一個重要目標。
這直接導致了不同的進程間可以擁有不同的數(shù)據(jù)內容(比如寫字板里不同的文本),但它們可以共用一個代碼段,因為這一部分不會因為運算的數(shù)據(jù)不同而有任何變化。 其實在Windows里,dll動態(tài)鏈接庫也是這個思想,一些函數(shù)功能和它的代碼部分,甚至在程序執(zhí)行時并不裝入內存,只有當程序運行到需要調用他們時才會被動態(tài)的真正裝入內存,同時只裝入內存一次,如果再有其它程序也需要調用這個dll,那么它們會共享這部分代碼段,從而能有效的提高內存的使用,減少浪費。
尤其是很多操作系統(tǒng)的底層調用,比如用于處理圖形界面的顯示等功能就可能被所有的圖形界面程序用到,這時就可以大大提高內存的利用率。
方法區(qū)與永久區(qū)的區(qū)別?
方法區(qū)(Method Area)是jvm規(guī)范里面的運行時數(shù)據(jù)區(qū)的一個組成部分,jvm規(guī)范中的運行時數(shù)據(jù)區(qū)還包含了:pc寄存器、虛擬機棧、堆、方法區(qū)、運行時常量池、本地方法棧
永久區(qū)也就是永久帶,又叫Perm區(qū),只存在于hotspot jvm中,并且只存在于jdk7和之前的版本中,jdk8中已經(jīng)徹底移除了永久帶,jdk8中引入了一個新的內存區(qū)域叫metaspace
到此,以上就是小編對于談談jvm內存區(qū)域的劃分的問題就介紹到這了,希望這3點解答對大家有用。
網(wǎng)頁題目:JVM內存區(qū)域劃分的原理是什么
鏈接URL:http://m.5511xx.com/article/ccdgggi.html


咨詢
建站咨詢
