一、前言
若想自己編寫的Java程序高效運(yùn)行,以及進(jìn)行正確、高效的異常診斷,JVM是不得不談的一個(gè)話題。本”JVM進(jìn)階“專欄大部分內(nèi)容均來源于經(jīng)典書籍《深入理解Java虛擬機(jī)》。
二、棧存儲(chǔ)
言歸正傳,本文重點(diǎn)從虛擬機(jī)內(nèi)存模型(運(yùn)行時(shí)數(shù)據(jù)區(qū)域)入手。先看下圖:
這是一張比較官方的虛擬機(jī)模型圖,今天講的就是虛線框中棧的部分。
棧是我們最常用的內(nèi)存區(qū)域。它主要用來存放基本類型變量,局部變量以及對象的引用。例如:User user = new User();這里的user就是對象的引用也可以理解為地址,指引著虛擬機(jī)要去哪里找user這個(gè)對象。 他們的基本關(guān)系如圖:
由上圖可知,當(dāng)我們將一個(gè)對象作為方法的參數(shù)時(shí),我們在方法中改變對象的值,也會(huì)影響到原來對象的值,因?yàn)槲覀冎皇歉淖兞藞D中內(nèi)存區(qū)域的值,他的指引(地址)還是一樣的。同時(shí)也可以看出,棧的內(nèi)存區(qū)域是連續(xù)的,有大小限制的,如果超過了就會(huì)拋出棧溢出的異常StackOverflowError。
在每個(gè)方法執(zhí)行的時(shí)候,都會(huì)創(chuàng)建一個(gè)個(gè)的棧幀,用于保存局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接等信息(以后都會(huì)詳細(xì)講解)。每次方法的調(diào)用都會(huì)對應(yīng)著一個(gè)棧幀,因此可以解釋當(dāng)我們在寫遞歸程序的時(shí)候會(huì)不小心報(bào)棧溢出的異常,因?yàn)闂J怯邢薜模椒ㄕ{(diào)用太多次導(dǎo)致棧幀堆滿了棧,所以溢出。看下面代碼:
public class Test {
private static int stackLength = 0;
private static void main(String[] args) {
try {
Test test = new Test();
test.stackOverFlow();
} catch (Throwable e) {
System.out.println("stackLength:" + stackLength);
throw e;
}
}
public void stackOverFlow() {
// 瘋狂遞歸調(diào)用
stackLength++;
stackOverFlow();
}
}
在參數(shù)-Xss128k的情況下的報(bào)錯(cuò)。(eclipse中設(shè)置參數(shù):右鍵代碼選擇Run As-->Run Configurations,在Arguments欄下的VM arguments中填入?yún)?shù),再Apply,再run)
每次在方法執(zhí)行完畢的時(shí)候,虛擬機(jī)會(huì)自動(dòng)釋放掉為該棧所分配的空間,在棧中,對應(yīng)著一個(gè)棧幀的出棧。虛擬機(jī)會(huì)自動(dòng)分配與回收內(nèi)存,因此效率比較高。
三、總結(jié)
最后做一下棧的總結(jié):
存放基本類型變量,局部變量,對象的引用;
系統(tǒng)自動(dòng)分配與回收內(nèi)存,效率較高,快速,存取速度比堆要快;
是一塊連續(xù)的內(nèi)存的區(qū)域,有大小限制,如果超過了就會(huì)棧溢出,并拋出棧溢出的異常StackOverflowError;
Java會(huì)自動(dòng)釋放掉為該變量所分配的內(nèi)存空間;
棧又分為java棧和本地方法棧。顧名思義,本地方法棧自然就是為本地方法提供服務(wù)的,java棧是為java服務(wù)的。
注意??:JVM棧是每個(gè)線程私有的!
四、拓展閱讀
《JVM虛擬機(jī)專欄》
審核編輯:符乾江
-
JAVA
+關(guān)注
關(guān)注
19文章
2976瀏覽量
105222 -
虛擬機(jī)
+關(guān)注
關(guān)注
1文章
949瀏覽量
28470
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
SSM框架在Java開發(fā)中的應(yīng)用 如何使用SSM進(jìn)行web開發(fā)
Java 23功能介紹
![<b class='flag-5'>Java</b> 23功能介紹](https://file1.elecfans.com/web3/M00/00/FA/wKgZO2dPuOmAC6YoAAAZQa1ialc743.png)
java小知識(shí)-納秒
Linux網(wǎng)絡(luò)協(xié)議棧的實(shí)現(xiàn)
![Linux網(wǎng)絡(luò)協(xié)議<b class='flag-5'>棧</b>的實(shí)現(xiàn)](https://file1.elecfans.com/web2/M00/06/C6/wKgaombfpT-AeVQcAACjr17dpiQ190.png)
?介紹一款Java開發(fā)的開源MES系統(tǒng)
![?介紹<b class='flag-5'>一</b>款<b class='flag-5'>Java</b>開發(fā)的開源MES系統(tǒng)](https://file1.elecfans.com/web2/M00/BD/33/wKgaomWg0PiAC1KoAAcHR_sH_FA403.png)
java反編譯能拿到源碼嗎
從原理聊JVM(一):染色標(biāo)記和垃圾回收算法
![從原理聊<b class='flag-5'>JVM</b>(<b class='flag-5'>一</b>):染色標(biāo)記和垃圾回收算法](https://file1.elecfans.com//web2/M00/04/71/wKgaombERMKAIkVjAAHROjCUdGM843.png)
聊聊JVM如何優(yōu)化
![聊聊<b class='flag-5'>JVM</b>如何優(yōu)化](https://file1.elecfans.com//web2/M00/00/A3/wKgZomawoA-AOQIdAAK39Pff6v0538.png)
華納云:java web和java有什么區(qū)別java web和java有什么區(qū)別
![華納云:<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別<b class='flag-5'>java</b> web和<b class='flag-5'>java</b>有什么區(qū)別](https://file1.elecfans.com/web2/M00/FD/AC/wKgaomaWBouAMAnAAAAglmvluP4293.png)
初識(shí)IO-Link及IO-Link設(shè)備軟件協(xié)議棧
![<b class='flag-5'>初識(shí)</b>IO-Link及IO-Link設(shè)備軟件協(xié)議<b class='flag-5'>棧</b>](https://file1.elecfans.com/web2/M00/F9/9D/wKgZomaLUNqAUDQ6AATSbLoa6xU520.png)
探索虛擬線程:原理與實(shí)現(xiàn)
![探索虛擬線程:原理與實(shí)現(xiàn)](https://file1.elecfans.com//web2/M00/F3/2C/wKgaomZ46XiAVMJUAAM2pHHfAVk296.png)
已經(jīng)安裝了Java,且依然提示安裝Java是為什么?
深入理解Java 8內(nèi)存管理機(jī)制及故障排查實(shí)戰(zhàn)指南
![深入理解<b class='flag-5'>Java</b> 8內(nèi)存管理機(jī)制及故障排查實(shí)戰(zhàn)指南](https://file1.elecfans.com/web2/M00/C7/05/wKgaomYFQnWABmUZAAAR8TkUyXc506.jpg)
RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階篇-進(jìn)階5 自定義實(shí)現(xiàn)insmod命令實(shí)驗(yàn)
![RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)<b class='flag-5'>進(jìn)階</b>篇-<b class='flag-5'>進(jìn)階</b>5 自定義實(shí)現(xiàn)insmod命令實(shí)驗(yàn)](https://file1.elecfans.com/web2/M00/C0/47/wKgZomXUQkaATvAlAADOvBJc2Tw686.png)
評(píng)論