java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法-創(chuàng)新互聯(lián)

本文主要給大家簡單講講java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法,相關(guān)專業(yè)術(shù)語大家可以上網(wǎng)查查或者找一些相關(guān)書籍補充一下,這里就不涉獵了,我們就直奔主題吧,希望java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法這篇文章可以給大家?guī)硪恍嶋H幫助。

成都創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的寧武網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

什么是JVM?JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的。Java虛擬機包括一套字節(jié)碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。

JVM屏蔽了與具體操作系統(tǒng)平臺相關(guān)的信息,使Java程序只需生成在Java虛擬機上運行的目標(biāo)代碼(字節(jié)碼),就可以在多種平臺上不加修改地運行。JVM在執(zhí)行字節(jié)碼時,實際上最終還是把字節(jié)碼解釋成具體平臺上的機器指令執(zhí)行。

JVM內(nèi)存區(qū)域

JVM在運行時候會將他管理的內(nèi)存劃分為多個區(qū)域,每個區(qū)域都有自己的用途,生命周期。下面我們根據(jù)內(nèi)存分區(qū)圖片逐個擊破:

java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法

程序計數(shù)器(Program Counter Register)

程序計數(shù)器所占內(nèi)存小,他的作用可以看做是當(dāng)前線程所執(zhí)行的字節(jié)碼的指示器,通過改變計數(shù)器的值來獲取下一條字節(jié)碼指令。

程序計數(shù)器在執(zhí)行Native方法的時候,計數(shù)器的值為空(undefined)。

程序計數(shù)器是線程私有的,每個線程都會分派一個。

在線視頻教程分享:java學(xué)習(xí)

虛擬機棧(VM Stack)

虛擬機棧為JVM執(zhí)行java方法服務(wù),每個方法被執(zhí)行的時候都會創(chuàng)建一個棧楨(Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口等信息。每一個方法從調(diào)用直至執(zhí)行結(jié)束,就對應(yīng)著一個棧幀從虛擬機棧中入棧到出棧的過程。

虛擬機棧的局部變量表內(nèi)存儲了以下數(shù)據(jù):

基本類型數(shù)據(jù)(boolean、byte、char、short、int、float、long、double)

對象引用(reference 類型)

returnAddress 類型(指向了一條字節(jié)碼指令的地址)

需要注意的是局部變量表所需的內(nèi)存空間在編譯期間就已經(jīng)確定了,大小不再變動。

虛擬機棧也是線程私有的,每個線程都會分派一個。

JVM對虛擬機棧規(guī)定了兩種異常:

StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度。

OutOfMemoryError:如果虛擬機棧可以動態(tài)擴展,而擴展時無法申請到足夠的內(nèi)存。

本地方法棧(Native Method Stack)

本地方法棧與虛擬機棧類似,主要區(qū)別就在于本地方法棧是專門為Native方法提供服務(wù)。

Native方法:在java中由Native關(guān)鍵字聲明的方法,非java語言實現(xiàn),是引用本地庫提供的第三方語言方法。

本地方法棧也是線程私有的,每個線程都會分派一個。

堆(Heap)

堆是所有線程共享的內(nèi)存區(qū)域,在JVM啟動時創(chuàng)建,一般是JVM內(nèi)占用大的一塊,垃圾收集器(GC)管理的主要區(qū)域。

堆中主要存儲的數(shù)據(jù)為:

對象

數(shù)組

堆可以在物理上不連續(xù),而只要在邏輯上連續(xù)即可,因此是一個可擴展的內(nèi)存區(qū)域。

當(dāng)堆內(nèi)存大小不夠創(chuàng)建對象或數(shù)組所占用的內(nèi)存大小,并且不能夠再擴展時,會拋出OutOfMemoryError異常。

方法區(qū)(Method Area)

方法區(qū)也是所有線程共享的內(nèi)存區(qū)域。

方法區(qū)主要存儲的數(shù)據(jù)為:

已被JVM加載的類信息

常量(從jdk1.7開始,運行時常量池移動到了堆中)

靜態(tài)變量

即時編譯器編譯后的代碼等數(shù)據(jù)

垃圾收集器(GC)比較少出現(xiàn)在這個區(qū)域,主要的內(nèi)存回收目標(biāo)是常量池的回收和對類型的卸載。

當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時,會拋出OutOfMemoryError異常。

常量池(Runtime Constant Pool)

常量池屬于方法區(qū)一部分,用于存放編譯期生成的各種字面量和符號引用。編譯期和運行期(String 的 intern() )都可以將常量放入池中。內(nèi)存有限,無法申請時拋出 OutOfMemoryError異常。

從jdk1.7開始,運行時常量池移動到了堆中。

直接內(nèi)存(Direct Memory)

直接內(nèi)存并不是JVM運行時內(nèi)存數(shù)據(jù)區(qū)域,也不是JVM規(guī)范中定義的內(nèi)存。

直接內(nèi)存占用物理內(nèi)存大小,需要注意在分配JVM內(nèi)存的時候要把直接內(nèi)存也計算在內(nèi),否則在動態(tài)擴展內(nèi)存時可能出現(xiàn)OutOfMemoryError異常。

java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法就先給大家講到這里,對于其它相關(guān)問題大家想要了解的可以持續(xù)關(guān)注我們的行業(yè)資訊。我們的板塊內(nèi)容每天都會捕捉一些行業(yè)新聞及專業(yè)知識分享給大家的。

本文標(biāo)題:java中劃分JVM內(nèi)存區(qū)域的詳細(xì)方法-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://muchs.cn/article18/cshcdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、營銷型網(wǎng)站建設(shè)網(wǎng)頁設(shè)計公司、響應(yīng)式網(wǎng)站搜索引擎優(yōu)化、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機網(wǎng)站建設(shè)