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

Java虛擬機(jī)棧jvm棧的作用

 更新時(shí)間:2021年11月08日 15:58:27   作者:小小奶酪可笑可笑  
本文主要介紹了Java虛擬機(jī)棧jvm棧的作用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

1. 定義

棧:線程運(yùn)行時(shí)需要的內(nèi)存空間,一個(gè)棧存在多個(gè)棧幀。棧具有先入后出,后入先出的特點(diǎn)。

棧幀:每個(gè)方法運(yùn)行時(shí)需要的內(nèi)存(局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接和方法返回值等信息。),每次調(diào)用一個(gè)方法,便會(huì)將棧幀壓入棧中,方法執(zhí)行完畢將棧幀從棧頂壓出

活動(dòng)棧幀:指在棧頂?shù)臈?,既正在調(diào)用的方法,每個(gè)線程只能有一個(gè)活動(dòng)棧幀,對(duì)應(yīng)著該線程正在調(diào)用的那個(gè)方法

現(xiàn)在我們用代碼來(lái)演示一下Java虛擬機(jī)如何將棧幀壓入及壓出棧中

 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;
     }
 }

當(dāng)我們運(yùn)行Main函數(shù)時(shí),jvm首先將棧幀Main壓入棧中,此視棧結(jié)構(gòu)如圖所示 

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

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

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

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

依次順序直至線程被銷(xiāo)毀。

注意點(diǎn)

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

2. 棧的線程安全問(wèn)題

局部變量是線程安全的

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

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

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

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

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

3. 棧內(nèi)存溢出

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

  • 棧幀過(guò)大(較少出現(xiàn))
  • 棧幀過(guò)多(一般出現(xiàn)在遞歸時(shí)。沒(méi)有正確設(shè)置遞歸出口)

現(xiàn)在我們來(lái)解釋一下什么時(shí)候會(huì)出現(xiàn)棧幀過(guò)多導(dǎo)致棧內(nèi)存溢出,我們來(lái)假設(shè)某一個(gè)棧的內(nèi)存空間大小是1024kb,現(xiàn)在有四個(gè)棧幀,每個(gè)棧幀的大小均為300kb,而 300 * 4 = 1200kb, 而 1200 > 1024 ,很顯然,現(xiàn)在這四個(gè)棧幀合起來(lái)的大小已經(jīng)超過(guò)了這個(gè)棧的內(nèi)存空間大小,這個(gè)時(shí)候就會(huì)出現(xiàn)棧內(nèi)存溢出,也就是會(huì)報(bào)java.lang.StackOverflowError這個(gè)錯(cuò)誤。

到此這篇關(guān)于Java虛擬機(jī)棧jvm棧的作用的文章就介紹到這了,更多相關(guān)Java jvm棧內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Spring中Bean的加載的方法

    詳解Spring中Bean的加載的方法

    本篇文章主要介紹了Spring中Bean的加載的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • Mybatis配置返回為修改影響條數(shù)方式

    Mybatis配置返回為修改影響條數(shù)方式

    這篇文章主要介紹了Mybatis配置返回為修改影響條數(shù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法

    IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法

    這篇文章主要介紹了IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹

    MyBatis學(xué)習(xí)教程(七)-Mybatis緩存介紹

    MyBatis緩存分為一級(jí)緩存和二級(jí)緩存一級(jí)緩存,本文給大家介紹mybatis緩存知識(shí),非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-05-05
  • 詳解hibernate4基本實(shí)現(xiàn)原理

    詳解hibernate4基本實(shí)現(xiàn)原理

    本文通過(guò)圖文并茂的形式給大家介紹的hibernate4基本實(shí)現(xiàn)原理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切

    Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切

    這篇文章主要給大家介紹了關(guān)于Java使用正則表達(dá)式檢索、替換String中特定字符和正則表達(dá)式的一切,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Spring框架設(shè)值注入操作實(shí)戰(zhàn)案例分析

    Spring框架設(shè)值注入操作實(shí)戰(zhàn)案例分析

    這篇文章主要介紹了Spring框架設(shè)值注入操作,結(jié)合具體實(shí)例形式分析了spring框架設(shè)值注入相關(guān)實(shí)現(xiàn)與使用方法,需要的朋友可以參考下
    2019-11-11
  • Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式

    Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式

    這篇文章主要介紹了Java微服務(wù)之Feign遠(yuǎn)程調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 使用MapStruct進(jìn)行Java Bean映射的方式

    使用MapStruct進(jìn)行Java Bean映射的方式

    MapStruct是一個(gè)用于JavaBean映射的注解處理器,它通過(guò)注解生成類(lèi)型安全且性能優(yōu)異的映射代碼,避免手動(dòng)編寫(xiě)重復(fù)的樣板代碼,主要特性包括類(lèi)型安全、高性能、簡(jiǎn)潔和可定制性,使用步驟包括定義映射接口、創(chuàng)建源類(lèi)和目標(biāo)類(lèi)、生成映射代碼并調(diào)用映射方法
    2025-02-02
  • mybatis使用foreach標(biāo)簽進(jìn)行嵌套插入

    mybatis使用foreach標(biāo)簽進(jìn)行嵌套插入

    數(shù)據(jù)庫(kù)插入操作常見(jiàn)于多層架構(gòu)設(shè)計(jì)中,本文提供了一個(gè)具體的實(shí)現(xiàn)方案,涉及三層實(shí)體類(lèi)結(jié)構(gòu),第一層實(shí)體類(lèi)負(fù)責(zé)基本數(shù)據(jù)結(jié)構(gòu)的定義,第二層和第三層實(shí)體類(lèi)則提供更詳細(xì)的業(yè)務(wù)邏輯處理,同時(shí),文章還介紹了相應(yīng)的mapper接口和配置文件設(shè)置
    2024-09-09

最新評(píng)論

敖汉旗| 九江县| 易门县| 桓仁| 望谟县| 申扎县| 合江县| 仁寿县| 丽水市| 保山市| 健康| 青州市| 江华| 洞头县| 尖扎县| 惠安县| 平乐县| 府谷县| 苗栗县| 柳林县| 苏尼特左旗| 盐城市| 平阴县| 大余县| 焦作市| 黎城县| 新闻| 环江| 普安县| 宁阳县| 长治市| 宕昌县| 胶州市| 武清区| 石阡县| 浙江省| 灵寿县| 治县。| 沭阳县| 齐河县| 巴里|