最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 虛擬機棧詳解分析

 更新時間:2021年11月08日 10:30:11   作者:小小奶酪可笑可笑  
在線程創(chuàng)建時,JVM會為每個線程創(chuàng)建一個單獨的??臻g。JVM的棧內存不需要是連續(xù)的。JVM在棧上會進行兩個操作:壓入和彈出棧幀。對于一個特定的線程來說,棧被稱為運行時棧。這個線程調用的每個方法會被存儲在響應的運行時棧里,包括了參數(shù),局部變量,計算媒介和其他數(shù)據(jù)

Java虛擬機棧

1. 定義

  • 棧:線程運行時需要的內存空間,一個棧存在多個棧幀。棧具有先入后出,后入先出的特點。
  • 棧幀:每個方法運行時需要的內存(局部變量表、操作數(shù)棧、動態(tài)鏈接和方法返回值等信息。),每次調用一個方法,便會將棧幀壓入棧中,方法執(zhí)行完畢將棧幀從棧頂壓出
  • 活動棧幀:指在棧頂?shù)臈?,既正在調用的方法,每個線程只能有一個活動棧幀,對應著該線程正在調用的那個方法

現(xiàn)在我們用代碼來演示一下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函數(shù)時,jvm首先將棧幀Main壓入棧中,此視棧結構如圖所示

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

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

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

method1方法執(zhí)行完畢后,將棧幀1彈出

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

注意點

  • 由于每個棧幀都會在方法調用完畢后被彈出,因此棧內存不需要進行垃圾回收
  • 每個棧都是線程私有的,每個線程在創(chuàng)建的時候都會創(chuàng)建一個虛擬機棧,而由于物理內存是固定的,棧內存劃分得越大,可分配的線程數(shù)就越少

2. 棧的線程安全問題

局部變量是線程安全的

現(xiàn)在我們定義如下方法:

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

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

方法參數(shù)和方法返回值不是線程安全

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

3. 棧內存溢出

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

  • 棧幀過大(較少出現(xiàn))
  • 棧幀過多(一般出現(xiàn)在遞歸時。沒有正確設置遞歸出口)

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

到此這篇關于Java 虛擬機棧詳解分析的文章就介紹到這了,更多相關Java 虛擬機棧內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java模擬UDP通信示例代碼

    Java模擬UDP通信示例代碼

    這篇文章主要介紹了Java模擬UDP通信,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2020-06-06
  • Java11中基于嵌套關系的訪問控制優(yōu)化詳解

    Java11中基于嵌套關系的訪問控制優(yōu)化詳解

    Java(和其他語言)通過內部類支持嵌套類,要使其正常工作,需要編譯器執(zhí)行一些技巧,下面這篇文章主要給大家介紹了關于Java11中基于嵌套關系的訪問控制優(yōu)化的相關資料,需要的朋友可以參考下
    2022-01-01
  • Java HtmlParse提取標簽中的值操作

    Java HtmlParse提取標簽中的值操作

    這篇文章主要介紹了Java HtmlParse提取標簽中的值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • java使用異或實現(xiàn)變量互換和異或加密解密示例

    java使用異或實現(xiàn)變量互換和異或加密解密示例

    這篇文章主要介紹了使用異或實現(xiàn)變量互換和異或加密解密示例,需要的朋友可以參考下
    2014-02-02
  • Java如何使用jar命令打包

    Java如何使用jar命令打包

    把多個文件打包成一個壓縮包——這個壓縮包和WinZip的壓縮格式是一樣的,區(qū)別在于jar壓縮的文件默認多一個META-INF的文件夾,該文件夾里包含一個MANIFEST.MF的文件,本文給大家介紹Java如何使用jar命令打包,感興趣的朋友跟隨小編一起看看吧
    2023-10-10
  • Java性能工具JMeter實現(xiàn)上傳與下載腳本編寫

    Java性能工具JMeter實現(xiàn)上傳與下載腳本編寫

    性能測試工作中,文件上傳也是經常見的性能壓測場景之一,那么 JMeter 文件上傳下載腳本怎么做,本文詳細的來介紹一下,感興趣的可以了解一下
    2021-07-07
  • java實現(xiàn)單鏈表中的增刪改

    java實現(xiàn)單鏈表中的增刪改

    這篇文章主要為大家詳細介紹了java實現(xiàn)單鏈表中的增刪改,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • java字符串比較獲取字符串出現(xiàn)次數(shù)的示例

    java字符串比較獲取字符串出現(xiàn)次數(shù)的示例

    java獲取一個字符串在整個字符串出現(xiàn)的次數(shù),下面寫出我的思路和二個實現(xiàn)方法,大家參考使用吧
    2014-01-01
  • Springboot中分析SQL性能的兩種方式詳解

    Springboot中分析SQL性能的兩種方式詳解

    文章介紹了SQL性能分析的兩種方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置簡單,適用于開發(fā)和測試環(huán)境,但高版本已棄用;p6spy框架功能更強大,可以自定義日志輸出格式,但在生產環(huán)境中使用需謹慎,感興趣的朋友一起看看吧
    2025-02-02
  • java 使用foreach遍歷集合元素的實例

    java 使用foreach遍歷集合元素的實例

    這篇文章主要介紹了java 使用foreach遍歷集合元素的實例的相關資料,這里提供實例幫助大家理解如何使用foreach 進行遍歷,希望能幫助到大家,
    2017-08-08

最新評論

建德市| 六枝特区| 无锡市| 宁都县| 仁寿县| 堆龙德庆县| 丹巴县| 泸西县| 白河县| 榆林市| 肃北| 墨江| 水城县| 那坡县| 綦江县| 桃源县| 福安市| 南城县| 上林县| 龙泉市| 海城市| 嘉义县| 天峻县| 大名县| 华坪县| 慈利县| 古交市| 阿拉尔市| 武隆县| 滨海县| 赣州市| 朔州市| 澄江县| 鄂托克旗| 柏乡县| 太和县| 尼木县| 恭城| 海丰县| 鄱阳县| 鹤山市|