91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java虛擬機棧jvm棧有什么用

發布時間:2021-11-08 17:45:38 來源:億速云 閱讀:303 作者:小新 欄目:開發技術

小編給大家分享一下Java虛擬機棧jvm棧有什么用,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

1. 定義

棧:線程運行時需要的內存空間,一個棧存在多個棧幀。棧具有先入后出,后入先出的特點。

棧幀:每個方法運行時需要的內存(局部變量表、操作數棧、動態鏈接和方法返回值等信息。),每次調用一個方法,便會將棧幀壓入棧中,方法執行完畢將棧幀從棧頂壓出

活動棧幀:指在棧頂的棧幀,既正在調用的方法,每個線程只能有一個活動棧幀,對應著該線程正在調用的那個方法

現在我們用代碼來演示一下Java虛擬機如何將棧幀壓入及壓出棧中

 public class Main {
     public static void main(String[] args) {
         method1();
     }
     
     private static void method1() {
         method2(1, 2);
     }
     
     private static int method2(int a, int b) {
         int c = a + b;
         return c;
     }
 }

當我們運行Main函數時,jvm首先將棧幀Main壓入棧中,此視棧結構如圖所示 

Java虛擬機棧jvm棧有什么用

Main函數體中調用了method1方法,此時便會將棧幀1壓入棧中

Java虛擬機棧jvm棧有什么用

method1方法體中調用了method2方法,這時jvm會將棧幀2壓入棧結構中,需要注意的是,前面我們提到了棧幀由 “局部變量表、操作數棧、動態鏈接和方法返回值”等信息組成,method2方法中擁有a,b兩個參數以及局部變量c和方法返回值

Java虛擬機棧jvm棧有什么用

當method2方法執行完后,會將棧幀2從棧頂彈出

Java虛擬機棧jvm棧有什么用

method1方法執行完畢后,將棧幀1彈出

Java虛擬機棧jvm棧有什么用

依次順序直至線程被銷毀。

注意點

  • 由于每個棧幀都會在方法調用完畢后被彈出,因此棧內存不需要進行垃圾回收

  • 每個棧都是線程私有的,每個線程在創建的時候都會創建一個虛擬機棧,而由于物理內存是固定的,棧內存劃分得越大,可分配的線程數就越少

2. 棧的線程安全問題

局部變量是線程安全的

現在我們定義如下方法:

 public static void method() {
     int a = 0;
     a++;
 }

我們在方法method中定義了一個局部變量a,并對其執行a++操作,現在假設我們有兩個線程同時調用了這個方法(棧幀),Java虛擬機會將該棧幀壓入各自線程的棧內存中,但由于局部變量表是線程私有的,所以兩個線程在同時調用這個棧幀后,a的值仍然都為1,故局部變量是線程安全的

Java虛擬機棧jvm棧有什么用

方法參數和方法返回值不是線程安全

由于方法的參數和返回值均可被外部方法所引用,故在某個線程下某個方法可以更改另外一個方法的參數和返回值,故方法參數和方法返回值不是線程安全的

3. 棧內存溢出

由于程序執行時,虛擬機給每個棧分配的棧內存空間是固定的,所以在一些情況下有可能出現棧內存空間不足,導致溢出的情況,一般有兩種情況可能導致棧內存溢出

  • 棧幀過大(較少出現)

  • 棧幀過多(一般出現在遞歸時。沒有正確設置遞歸出口)

現在我們來解釋一下什么時候會出現棧幀過多導致棧內存溢出,我們來假設某一個棧的內存空間大小是1024kb,現在有四個棧幀,每個棧幀的大小均為300kb,而 300 * 4 = 1200kb, 而 1200 > 1024 ,很顯然,現在這四個棧幀合起來的大小已經超過了這個棧的內存空間大小,這個時候就會出現棧內存溢出,也就是會報java.lang.StackOverflowError這個錯誤。

Java虛擬機棧jvm棧有什么用

看完了這篇文章,相信你對“Java虛擬機棧jvm棧有什么用”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

扬中市| 西昌市| 湖口县| 龙陵县| 九江县| 水城县| 玉溪市| 突泉县| 林甸县| 朔州市| 永济市| 曲松县| 乌鲁木齐县| 鄯善县| 湄潭县| 崇明县| 托里县| 开封县| 玛沁县| 海宁市| 攀枝花市| 山阴县| 曲靖市| 扶余县| 长丰县| 黔西县| 商南县| 赤城县| 潮州市| 汕头市| 仁怀市| 巴中市| 南溪县| 澄迈县| 林周县| 米泉市| 蒲江县| 佛冈县| 荥阳市| 宝应县| 玉龙|