這篇文章給大家分享的是有關(guān)Java虛擬機結(jié)構(gòu)是怎么樣的的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
創(chuàng)新互聯(lián)擁有一支富有激情的企業(yè)網(wǎng)站制作團隊,在互聯(lián)網(wǎng)網(wǎng)站建設行業(yè)深耕10多年,專業(yè)且經(jīng)驗豐富。10多年網(wǎng)站優(yōu)化營銷經(jīng)驗,我們已為成百上千中小企業(yè)提供了成都網(wǎng)站設計、成都網(wǎng)站建設、外貿(mào)網(wǎng)站建設解決方案,按需制作網(wǎng)站,設計滿意,售后服務無憂。所有客戶皆提供一年免費網(wǎng)站維護!
一、JVM主要的結(jié)構(gòu)如下:
二、各個區(qū)域功能介紹
1)、方法區(qū)(Method Area):
(1)用于存儲虛擬機加載的類信息、常量、靜態(tài)變量等,是各個線程共享的內(nèi)存區(qū)域;
(2)默認最小值為16MB,最大值為64MB,可以通過-XX:PermSize 和 -XX:MaxPermSize 參數(shù)限制方法區(qū)的大小;
(3)方法區(qū)中還有一部分是運行時常量池,主要用來存儲編譯時生成的字面量和符號引用,常量也可以在運行時產(chǎn)生,如String的intern方法;
(4)和Java堆一樣不需要連續(xù)的內(nèi)存和可以選擇固定大小或可擴展外,還可以選擇不實現(xiàn)垃圾收集。
2)、棧:
(1)Java虛擬機棧是線程私有的,生命周期與線程相同。
(2)每個方法被執(zhí)行的時候都同時創(chuàng)建一個棧幀(stack frame),用于存儲局部變量表,操作棧,動態(tài)鏈接,方法出口等信息。每一個方法執(zhí)行完的過程就對應棧幀在棧中進入進出的過程。棧幀由三部分組成:局部變量區(qū)、操作數(shù)棧、幀數(shù)據(jù)區(qū)。
(3)JVM虛擬機棧中的局部變量表存儲了編譯期可知的各種基本數(shù)據(jù)類型。局部變量表所需要的空間在編譯期就分配完成。
(4)棧幀是方法運行期的基礎數(shù)據(jù)結(jié)構(gòu)。
3)、本地方法棧(Native Method Stack):
(1)本地方法棧為JVM虛擬機使用到的Native方法服務。
在HotSpot中并不區(qū)分虛擬機棧和本地方法棧
4)、堆(Heap):
(1)Java虛擬機所管理的內(nèi)存中最大的一塊。
(2)Java堆是所有線程共享的區(qū)域,在虛擬機啟動時創(chuàng)建。
(3)內(nèi)存區(qū)域的唯一目的就是存放對象實例,所有的對象實例以及數(shù)組都在堆上分配內(nèi)存。
(4)Java堆是JVM垃圾回收機制主要管理的內(nèi)存區(qū)域,Java堆可以處于內(nèi)存上不連續(xù)的內(nèi)存空間。
5)、程序計數(shù)器:
(1)一塊比較小的內(nèi)存空間,它的作用可以看做是當前線程所執(zhí)行的字節(jié)碼的行號指示器
(2)字節(jié)碼解釋器工作時就是通過改變這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令、分支,循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復等都需要依賴程序計數(shù)器。
6)、運行時常量池:
(1)運行時常量池是方法區(qū)的一部分。
(2)Class文件中除了有類的版本、字段、方法接口描述等信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內(nèi)容將在類加載
之后存放到方法區(qū)的運行時常量池。
7)、直接內(nèi)存:
由于Java引進了NIO,引入了通道和緩沖區(qū)的IO方式,可以調(diào)用Native方法直接分配堆外內(nèi)存,這個堆外內(nèi)存就是本機內(nèi)存,不會影響堆內(nèi)存大小。
感謝各位的閱讀!關(guān)于“Java虛擬機結(jié)構(gòu)是怎么樣的”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!