您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Java虛擬機結構是怎么樣的的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、JVM主要的結構如下:
二、各個區域功能介紹
1)、方法區(Method Area):
(1)用于存儲虛擬機加載的類信息、常量、靜態變量等,是各個線程共享的內存區域;
(2)默認最小值為16MB,最大值為64MB,可以通過-XX:PermSize 和 -XX:MaxPermSize 參數限制方法區的大小;
(3)方法區中還有一部分是運行時常量池,主要用來存儲編譯時生成的字面量和符號引用,常量也可以在運行時產生,如String的intern方法;
(4)和Java堆一樣不需要連續的內存和可以選擇固定大小或可擴展外,還可以選擇不實現垃圾收集。
2)、棧:
(1)Java虛擬機棧是線程私有的,生命周期與線程相同。
(2)每個方法被執行的時候都同時創建一個棧幀(stack frame),用于存儲局部變量表,操作棧,動態鏈接,方法出口等信息。每一個方法執行完的過程就對應棧幀在棧中進入進出的過程。棧幀由三部分組成:局部變量區、操作數棧、幀數據區。
(3)JVM虛擬機棧中的局部變量表存儲了編譯期可知的各種基本數據類型。局部變量表所需要的空間在編譯期就分配完成。
(4)棧幀是方法運行期的基礎數據結構。
3)、本地方法棧(Native Method Stack):
(1)本地方法棧為JVM虛擬機使用到的Native方法服務。
在HotSpot中并不區分虛擬機棧和本地方法棧
4)、堆(Heap):
(1)Java虛擬機所管理的內存中最大的一塊。
(2)Java堆是所有線程共享的區域,在虛擬機啟動時創建。
(3)內存區域的唯一目的就是存放對象實例,所有的對象實例以及數組都在堆上分配內存。
(4)Java堆是JVM垃圾回收機制主要管理的內存區域,Java堆可以處于內存上不連續的內存空間。
5)、程序計數器:
(1)一塊比較小的內存空間,它的作用可以看做是當前線程所執行的字節碼的行號指示器
(2)字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令、分支,循環、跳轉、異常處理、線程恢復等都需要依賴程序計數器。
6)、運行時常量池:
(1)運行時常量池是方法區的一部分。
(2)Class文件中除了有類的版本、字段、方法接口描述等信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載
之后存放到方法區的運行時常量池。
7)、直接內存:
由于Java引進了NIO,引入了通道和緩沖區的IO方式,可以調用Native方法直接分配堆外內存,這個堆外內存就是本機內存,不會影響堆內存大小。
感謝各位的閱讀!關于“Java虛擬機結構是怎么樣的”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。