亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1. 定義

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

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

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

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

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

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

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

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

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

注意點(diǎn)

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

2. 棧的線程安全問題

局部變量是線程安全的

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • Java中的switch新特性與使用詳解

    Java中的switch新特性與使用詳解

    這篇文章主要介紹了Java中的switch新特性與使用詳解,Switch語句可以實(shí)現(xiàn)根據(jù)某一變量選則執(zhí)行代碼塊,當(dāng)然直接使用If語句也可以做到,但是有時候使用Switch語句往往更加簡潔優(yōu)美,需要的朋友可以參考下
    2023-11-11
  • Java別說取余(%)運(yùn)算簡單你真的會嗎

    Java別說取余(%)運(yùn)算簡單你真的會嗎

    這篇文章主要介紹了Java別說取余(%)運(yùn)算簡單你真的會嗎,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • SpringBoot實(shí)現(xiàn)國際化的操作步驟

    SpringBoot實(shí)現(xiàn)國際化的操作步驟

    國際化(Internationalization) 是指為了適應(yīng)不同語言、文化和地區(qū)的用戶,使軟件能夠方便地進(jìn)行本地化修改的過程,本文介紹了SpringBoot 國際化功能的簡單使用,感興趣的朋友可以參考下
    2024-02-02
  • Java檢查非空的三種方法總結(jié)

    Java檢查非空的三種方法總結(jié)

    這篇文章主要介紹了Java檢查非空的三種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java程序員常見的sql錯誤

    java程序員常見的sql錯誤

    當(dāng)Java程序員在SQL中要寫個查詢語句是很簡單的。但在Java里類似的語句卻不容易,因為程序員不僅要反復(fù)考慮編程范式,而且也要考慮算法的問題。下面我們來看看這幾個常見的錯誤吧
    2019-06-06
  • 10本Java架構(gòu)師必讀書籍

    10本Java架構(gòu)師必讀書籍

    這篇文章主要介紹了10本Java架構(gòu)師必讀書籍,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • java并發(fā)編程中的SynchronousQueue實(shí)現(xiàn)原理解析

    java并發(fā)編程中的SynchronousQueue實(shí)現(xiàn)原理解析

    這篇文章主要介紹了java并發(fā)編程中的SynchronousQueue實(shí)現(xiàn)原理解析,SynchronousQueue是一個比較特別的隊列,此隊列源碼中充斥著大量的CAS語句,理解起來是有些難度的,為了方便日后回顧,本篇文章會以簡潔的圖形化方式展示該隊列底層的實(shí)現(xiàn)原理,需要的朋友可以參考下
    2023-12-12
  • Java異常之圖書管理系統(tǒng)

    Java異常之圖書管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java異常之圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Java語言實(shí)現(xiàn)簡單FTP軟件 FTP連接管理模塊實(shí)現(xiàn)(8)

    Java語言實(shí)現(xiàn)簡單FTP軟件 FTP連接管理模塊實(shí)現(xiàn)(8)

    這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡單FTP軟件,F(xiàn)TP連接管理模塊的實(shí)現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • JAVA實(shí)現(xiàn)線程的三種方法

    JAVA實(shí)現(xiàn)線程的三種方法

    這篇文章介紹了JAVA實(shí)現(xiàn)線程的三種方法,有需要的朋友可以參考一下
    2013-09-09

最新評論