您好,登錄后才能下訂單哦!
jvm的內存結構主要包含哪幾個部分?針對這個問題,今天小編總結這篇有關內存結構的文章,希望能幫助更多想解決這個問題的朋友找到更加簡單易行的辦法。
jvm內存分為五大塊:
標灰的是線程公有的內存區域,沒有標灰的是線程私有
一:程序計數器:程序計數器是用來指示當前線程要執行哪條指令,并且在執行完該條指令后讓程序計數器指向下一條指令,直到將程序執行完畢。指令需要靠cpu來執行,在多線程中,多個線程是通過輪流切換分配cpu的時間片而執行的,在切換時需要記錄當前執行到了哪條指令以便將來繼續執行,每一個線程都需要有自己的程序計數器,所以程序計數器是線程私有的內存。
二:虛擬機棧:通常我們把jvm的內存粗略的分為堆和棧,其中的棧指的就是虛擬機棧,虛擬機棧也是線程私有的。
虛擬機棧對應的是方法的內存區域,每個方法執行時都會創建一個棧幀,用來存儲該方法的局部變量表,操作數棧,動態鏈接,方法返回地址:
1. 局部變量表:局部變量表中存儲的是方法的參數和方法中定義的局部變量,在編譯期間就為局部變量表分配好了內存空間。局部變量表中存儲三種類型的數據:
(1) 基本數據類型
(2) 引用類型:指向一個對象在內存中的地址
(3) returnAddress類型:指向指令的地址(已經很少見了,指向異常處理的指令,現在已經由異常表代替)
2. 操作數棧:當虛擬機執行一些指令的時候會對操作數棧進行入棧或出棧的操作,比如iadd指令將兩個數相加,會先將操作數棧中的兩個數彈出來(出棧),相加后再壓入棧(入棧)中。
3. 動態鏈接:在運行時常量池中存儲了諸如類名,方法名,我們要找到目標類,執行相應的方法就需要用到動態鏈接,棧幀中有一個指向運行時常量池的引用,通過這個引用可以找到相應的類名和方法名,但是光知道名稱是沒法執行方法的,需要通過名稱找到相應的類和方法在內存中的地址,這個過程就是動態鏈接。
4. 方法返回地址:當方法執行完以后如果有返回值,就會把這個返回值返回給該方法的調用者,方法的返回就是我們java中用到的return命令。方法返回之后調用者需要繼續往下執行就需要知道要執行的地址,該地址就是方法返回地址,它被記錄在了棧幀中,當然在發生異常的情況下不會有返回值,要繼續執行的地址可以通過異常處理器表來確定。
虛擬機棧可能出現兩種類型的異常:
1. 線程請求的棧深度大于虛擬機允許的棧深度會拋出StackOverflowError,(虛擬機棧空間不能動態擴展的情況下)
2. 如果虛擬機棧空間可以動態擴展(目前多數的虛擬機都可以),當動態擴展無法申請到足夠的空間時會拋出OutOfMemory異常。
三:本地方法棧:本地方法棧與虛擬機棧的作用是一樣的,區別在于虛擬機棧為虛擬機執行java方法服務,而本地方法棧為虛擬機執行native方法服務,native方法為本地方法,不是用java語言寫的有可能是c或者c++寫的,在jdk中就有很多c的代碼,就是提供給本地方法來調用的。
四:堆:通常我們把jvm的內存粗略的分為堆和棧,其中的堆就是指它,它是虛擬機中占用內存最大的一塊,是被所有線程共享的一塊區域,它是用來存放對象實例的。是垃圾收集器管理的主要區域。
五:方法區:方法區也是被所有線程共享的一塊區域,它存儲的是類信息,常量,靜態變量,編譯后的字節碼等信息。方法區中還有一塊區域“運行時常量池“:運行時常量池中存儲的是編譯期生成的各種字面量和符號引用。字面量相當于Java里常量的概念,比如字符串,聲明為final的常量值等,符號引用包括了:類和接口名,字段名,方法名。
看完上述內容,你們對jvm的內存結構有進一步的了解嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。