Java內(nèi)存模型中的虛擬機(jī)棧原理分析
Java虛擬機(jī)在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域,這些區(qū)域都會有各自的用途,以及創(chuàng)建和銷毀的時間,有的區(qū)域會隨著虛擬機(jī)進(jìn)程的啟動而存在,有些區(qū)域則依賴用戶線程的啟動和結(jié)束而建立和銷毀。Java虛擬機(jī)所管理的內(nèi)存將會包括以下幾個運(yùn)行時數(shù)據(jù)區(qū)域。如下圖所示(圖片來自《深入理解Java虛擬機(jī)》一書)。
在內(nèi)存中,棧分為兩部分,一部分是本地方法棧,為虛擬機(jī)使用到的Native方法服務(wù),具體的虛擬機(jī)可以自由實(shí)現(xiàn),另一部分就是虛擬機(jī)棧,主要是為虛擬機(jī)執(zhí)行Java方法服務(wù),因此也成為Java棧,本文主要是對虛擬機(jī)棧進(jìn)行詳細(xì)解讀。
1. Java棧也稱為虛擬機(jī)棧,也就是我們常常所說的棧。 Java棧是Java方法執(zhí)行的內(nèi)存模型。
2. Java棧中存放的是一個個的棧幀,每個棧幀對應(yīng)一個被調(diào)用的方法,在棧幀中包括局部變量表(Local Variables)、操作數(shù)棧(Operand Stack)、指向當(dāng)前方法所屬的類的運(yùn)行時常量池(運(yùn)行時常量池的概念在方法區(qū)部分會談到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些額外的附加信息。 當(dāng)線程執(zhí)行一個方法時,就會隨之創(chuàng)建一個對應(yīng)的棧幀,并將建立的棧幀壓棧。當(dāng)方法執(zhí)行完畢之后,便會將棧幀出棧。 因此對于方法沒有存在回收資源一說 。
3. 局部變量表,顧名思義,想必不用解釋大家應(yīng)該明白它的作用了吧。就是用來存儲方法中的局部變量(包括在方法中聲明的非靜態(tài)變量以及函數(shù)形參)。對于基本數(shù)據(jù)類型的變量,則直接存儲它的值,對于引用類型的變量,則存的是指向?qū)ο蟮囊?。局部變量表的大小在編譯器就可以確定其大小了,因此在程序執(zhí)行期間局部變量表的大小是不會改變的。
4. 操作數(shù)棧,想必學(xué)過數(shù)據(jù)結(jié)構(gòu)中的棧的朋友想必對表達(dá)式求值問題不會陌生,棧最典型的一個應(yīng)用就是用來對表達(dá)式求值。想想一個線程執(zhí)行方法的過程中,實(shí)際上就是不斷執(zhí)行語句的過程,而歸根到底就是進(jìn)行計算的過程。因此可以這么說,程序中的所有計算過程都是在借助于操作數(shù) 。
5. 指向運(yùn)行時常量池的引用,因為在方法執(zhí)行的過程中有可能需要用到類中的常量,所以必須要有一個引用指向運(yùn)行時常量。
6. 方法返回地址,當(dāng)一個方法執(zhí)行完畢之后,要返回之前調(diào)用它的地方,因此在棧幀中必須保存一個方法返回地址。
7. 由于每個線程正在執(zhí)行的方法可能不同,因此每個線程都會有一個自己的Java棧,互不干擾。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JDK與JRE的下載和安裝以及配置JDK環(huán)境變量圖文教程
JRE也就是(Java?RuntimeEnvironment)Java運(yùn)行環(huán)境,是運(yùn)行JAVA程序所必須的環(huán)境的集合,包含各種類庫,下面這篇文章主要給大家介紹了關(guān)于JDK與JRE的下載和安裝以及配置JDK環(huán)境變量的相關(guān)資料,需要的朋友可以參考下2023-12-12深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示
堆排序基于二叉堆結(jié)構(gòu)即完全二叉樹,可利用最大堆和最小堆的組建方式來進(jìn)行排序,這里就來深入解析堆排序的算法思想及Java代碼的實(shí)現(xiàn)演示2016-06-06Java C++題解leetcode1620網(wǎng)絡(luò)信號最好的坐標(biāo)
這篇文章主要為大家介紹了Java C++題解leetcode1620網(wǎng)絡(luò)信號最好的坐標(biāo)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Java實(shí)現(xiàn)解析JSON大文件JsonReader工具詳解
這篇文章主要介紹了Java實(shí)現(xiàn)解析JSON大文件的工具JsonReader使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01Spring4.0 MVC請求json數(shù)據(jù)報406錯誤的解決方法
這篇文章主要為大家詳細(xì)介紹了Spring4.0 MVC請求json數(shù)據(jù)報406錯誤的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01