一、前言
若想自己編寫的Java程序高效運行,以及進(jìn)行正確、高效的異常診斷,JVM是不得不談的一個話題。本”JVM進(jìn)階“專欄大部分內(nèi)容均來源于經(jīng)典書籍《深入理解Java虛擬機》。
二、棧存儲
言歸正傳,本文重點從虛擬機內(nèi)存模型(運行時數(shù)據(jù)區(qū)域)入手。先看下圖:
這是一張比較官方的虛擬機模型圖,今天講的就是虛線框中棧的部分。
棧是我們最常用的內(nèi)存區(qū)域。它主要用來存放基本類型變量,局部變量以及對象的引用。例如:User user = new User();這里的user就是對象的引用也可以理解為地址,指引著虛擬機要去哪里找user這個對象。 他們的基本關(guān)系如圖:
由上圖可知,當(dāng)我們將一個對象作為方法的參數(shù)時,我們在方法中改變對象的值,也會影響到原來對象的值,因為我們只是改變了圖中內(nèi)存區(qū)域的值,他的指引(地址)還是一樣的。同時也可以看出,棧的內(nèi)存區(qū)域是連續(xù)的,有大小限制的,如果超過了就會拋出棧溢出的異常StackOverflowError。
在每個方法執(zhí)行的時候,都會創(chuàng)建一個個的棧幀,用于保存局部變量表,操作數(shù)棧,動態(tài)鏈接等信息(以后都會詳細(xì)講解)。每次方法的調(diào)用都會對應(yīng)著一個棧幀,因此可以解釋當(dāng)我們在寫遞歸程序的時候會不小心報棧溢出的異常,因為棧是有限的,方法調(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的情況下的報錯。(eclipse中設(shè)置參數(shù):右鍵代碼選擇Run As-->Run Configurations,在Arguments欄下的VM arguments中填入?yún)?shù),再Apply,再run)
每次在方法執(zhí)行完畢的時候,虛擬機會自動釋放掉為該棧所分配的空間,在棧中,對應(yīng)著一個棧幀的出棧。虛擬機會自動分配與回收內(nèi)存,因此效率比較高。
三、總結(jié)
最后做一下棧的總結(jié):
存放基本類型變量,局部變量,對象的引用;
系統(tǒng)自動分配與回收內(nèi)存,效率較高,快速,存取速度比堆要快;
是一塊連續(xù)的內(nèi)存的區(qū)域,有大小限制,如果超過了就會棧溢出,并拋出棧溢出的異常StackOverflowError;
Java會自動釋放掉為該變量所分配的內(nèi)存空間;
棧又分為java棧和本地方法棧。顧名思義,本地方法棧自然就是為本地方法提供服務(wù)的,java棧是為java服務(wù)的。
注意??:JVM棧是每個線程私有的!
四、拓展閱讀
《JVM虛擬機專欄》
審核編輯:符乾江
-
JAVA
+關(guān)注
關(guān)注
20文章
3001瀏覽量
116419 -
虛擬機
+關(guān)注
關(guān)注
1文章
972瀏覽量
30464
發(fā)布評論請先 登錄
軟通動力以全棧智能重塑中國科技企業(yè)全球化競爭新優(yōu)勢
2026年度《電子元件與電路設(shè)計進(jìn)階:案例分析與故障解決》公開課杭州來襲!
第8章 函數(shù)進(jìn)階與按鍵(8.1 8.2)
ETAS INCA軟件的五個實用進(jìn)階功能
Stack棧到底用來干嘛的呢?
Arm Neoverse CPU上大代碼量Java應(yīng)用的性能測試
Java效率提升指南:5個Java工具選型建議及Perforce JRebel和XRebel介紹
自動駕駛中常提的“全棧”是個啥?有必要“全棧”嗎?
【Java開發(fā)必備】IntelliJ IDEA數(shù)據(jù)庫功能進(jìn)階指南:9個JetBrains工程師私藏技巧
RK3568驅(qū)動指南|驅(qū)動基礎(chǔ)進(jìn)階篇-進(jìn)階7 向系統(tǒng)中添加一個系統(tǒng)調(diào)用
全棧開發(fā)進(jìn)階指南:LuatOS-log庫從入門到實戰(zhàn)!
Altium Designer PCB設(shè)計高級進(jìn)階
Java開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多Java開發(fā)者在用?
從 Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵
深入淺出解析低功耗藍(lán)牙協(xié)議棧
JVM進(jìn)階知識(一):初識 JAVA 棧
評論