国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

JVM 虛擬機(jī)棧介紹

這篇具有很好參考價(jià)值的文章主要介紹了JVM 虛擬機(jī)棧介紹。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

JVM 虛擬機(jī)棧介紹一、虛擬機(jī)棧(VM Stack)

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-475693.html

1.1)什么是虛擬機(jī)棧

  虛擬機(jī)棧是用于描述java方法執(zhí)行的內(nèi)存模型。

  每個(gè)java方法在執(zhí)行時(shí),會(huì)創(chuàng)建一個(gè)“棧幀(stack frame)”,棧幀的結(jié)構(gòu)分為“局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法出口”幾個(gè)部分(具體的作用會(huì)在字節(jié)碼執(zhí)行引擎章節(jié)中講到,這里只需要了解棧幀是一個(gè)方法執(zhí)行時(shí)所需要數(shù)據(jù)的結(jié)構(gòu))。我們常說(shuō)的“堆內(nèi)存、棧內(nèi)存”中的“棧內(nèi)存”指的便是虛擬機(jī)棧,確切地說(shuō),指的是虛擬機(jī)棧的棧幀中的局部變量表,因?yàn)檫@里存放了一個(gè)方法的所有局部變量。

  方法調(diào)用時(shí),創(chuàng)建棧幀,并壓入虛擬機(jī)棧;方法執(zhí)行完畢,棧幀出棧并被銷毀,如下圖所示:

?

1.2)虛擬機(jī)棧的特點(diǎn)

  虛擬機(jī)棧是線程隔離的,即每個(gè)線程都有自己獨(dú)立的虛擬機(jī)棧。

1.3)虛擬機(jī)棧的StackOverflowError

  若單個(gè)線程請(qǐng)求的棧深度大于虛擬機(jī)允許的深度,則會(huì)拋出StackOverflowError(棧溢出錯(cuò)誤)。

  JVM會(huì)為每個(gè)線程的虛擬機(jī)棧分配一定的內(nèi)存大?。?Xss參數(shù)),因此虛擬機(jī)棧能夠容納的棧幀數(shù)量是有限的,若棧幀不斷進(jìn)棧而不出棧,最終會(huì)導(dǎo)致當(dāng)前線程虛擬機(jī)棧的內(nèi)存空間耗盡,典型如一個(gè)無(wú)結(jié)束條件的遞歸函數(shù)調(diào)用,代碼見(jiàn)下:

復(fù)制代碼

?1 /**

?2 * java棧溢出StackOverFlowError

?3 * JVM參數(shù):-Xss128k

?4 * Created by chenjunyi on 2018/4/25.

?5 */

?6 public class JavaVMStackSOF {

?7?

?8 private int stackLength = -1;

?9?

10 //通過(guò)遞歸調(diào)用造成StackOverFlowError

11 public void stackLeak() {

12 stackLength++;

13 stackLeak();

14 }

15?

16 public static void main(String[] args) {

17 JavaVMStackSOF oom = new JavaVMStackSOF();

18 try {

19 oom.stackLeak();

20 } catch (Throwable e) {

21 System.out.println("Stack length:" + oom.stackLength);

22 e.printStackTrace();

23 }

24 }

25?

26 }

復(fù)制代碼

  設(shè)置單個(gè)線程的虛擬機(jī)棧內(nèi)存大小為128K,執(zhí)行main方法后,拋出了StackOverflow異常

復(fù)制代碼

1 Stack length:983

2 java.lang.StackOverflowError

3 at com.manayi.study.jvm.chapter2._02_JavaVMStackSOF.stackLeak(_02_JavaVMStackSOF.java:14)

4 at com.manayi.study.jvm.chapter2._02_JavaVMStackSOF.stackLeak(_02_JavaVMStackSOF.java:15)

5 at com.manayi.study.jvm.chapter2._02_JavaVMStackSOF.stackLeak(_02_JavaVMStackSOF.java:15)

6 ······

復(fù)制代碼

1.4)虛擬機(jī)棧的OutOfMemoryError

  不同于StackOverflowError,OutOfMemoryError指的是當(dāng)整個(gè)虛擬機(jī)棧內(nèi)存耗盡,并且無(wú)法再申請(qǐng)到新的內(nèi)存時(shí)拋出的異常。

  JVM未提供設(shè)置整個(gè)虛擬機(jī)棧占用內(nèi)存的配置參數(shù)。虛擬機(jī)棧的最大內(nèi)存大致上等于“JVM進(jìn)程能占用的最大內(nèi)存(依賴于具體操作系統(tǒng)) - 最大堆內(nèi)存 - 最大方法區(qū)內(nèi)存 - 程序計(jì)數(shù)器內(nèi)存(可以忽略不計(jì)) - JVM進(jìn)程本身消耗內(nèi)存”。當(dāng)虛擬機(jī)棧能夠使用的最大內(nèi)存被耗盡后,便會(huì)拋出OutOfMemoryError,可以通過(guò)不斷開(kāi)啟新的線程來(lái)模擬這種異常,代碼如下:

復(fù)制代碼

?1 **

?2 * java棧溢出OutOfMemoryError

?3 * JVM參數(shù):-Xss2m

?4 * Created by chenjunyi on 2018/4/25.

?5 */

?6 public class JavaVMStackOOM {

?7?

?8 private void dontStop() {

?9 while (true) {

10 }

11 }

12?

13 //通過(guò)不斷的創(chuàng)建新的線程使Stack內(nèi)存耗盡

14 public void stackLeakByThread() {

15 while (true) {

16 Thread thread = new Thread(() -> dontStop());

17 thread.start();

18 }

19 }

20?

21 public static void main(String[] args) {

22 JavaVMStackOOM oom = new _03_JavaVMStackOOM();

23 oom.stackLeakByThread();

24 }

25?

26 }

復(fù)制代碼

  設(shè)置單個(gè)線程虛擬機(jī)棧的占用內(nèi)存為2m并不斷生成新的線程,最終虛擬機(jī)棧無(wú)法申請(qǐng)到新的內(nèi)存,拋出異常:

1 Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

二、本地方法棧(Native Method Stack)

  本地方法棧的功能和特點(diǎn)類似于虛擬機(jī)棧,均具有線程隔離的特點(diǎn)以及都能拋出StackOverflowError和OutOfMemoryError異常。

  不同的是,本地方法棧服務(wù)的對(duì)象是JVM執(zhí)行的native方法,而虛擬機(jī)棧服務(wù)的是JVM執(zhí)行的java方法。如何去服務(wù)native方法?native方法使用什么語(yǔ)言實(shí)現(xiàn)?怎么組織像棧幀這種為了服務(wù)方法的數(shù)據(jù)結(jié)構(gòu)?虛擬機(jī)規(guī)范并未給出強(qiáng)制規(guī)定,因此不同的虛擬機(jī)實(shí)可以進(jìn)行自由實(shí)現(xiàn),我們常用的HotSpot虛擬機(jī)選擇合并了虛擬機(jī)棧和本地方法棧。

?

到了這里,關(guān)于JVM 虛擬機(jī)棧介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • JVM學(xué)習(xí)(八):運(yùn)行時(shí)數(shù)據(jù)區(qū)——虛擬機(jī)棧(字節(jié)碼程度深入剖析)

    JVM學(xué)習(xí)(八):運(yùn)行時(shí)數(shù)據(jù)區(qū)——虛擬機(jī)棧(字節(jié)碼程度深入剖析)

    目錄 一、概述? 1.1 基于棧結(jié)構(gòu)的虛擬機(jī)? 1.2 棧和堆 二、虛擬機(jī)棧(Java Virtual Machine Stack)詳述 2.1 虛擬機(jī)棧介紹? 2.2 虛擬機(jī)棧作用 2.3 虛擬機(jī)棧特點(diǎn)? 三、棧中常見(jiàn)的異常? 3.1?StackOverflowError異常 3.2?OutOfMemoryError異常 四、棧的運(yùn)行原理 4.1 棧的存儲(chǔ)單位? 4.2 棧的運(yùn)行原理?

    2024年02月01日
    瀏覽(32)
  • JVM第三篇 運(yùn)行時(shí)數(shù)據(jù)區(qū)-虛擬機(jī)棧和PC程序計(jì)數(shù)器

    JVM第三篇 運(yùn)行時(shí)數(shù)據(jù)區(qū)-虛擬機(jī)棧和PC程序計(jì)數(shù)器

    目錄 1. JAVA中的線程 ?2.? 棧區(qū)? 2.1 棧幀 2.2 ??赡艹霈F(xiàn)的異常 2.3 設(shè)置棧大小 3.程序計(jì)數(shù)器(PC) ?4. PC和棧發(fā)揮的作用 ?5. 關(guān)于棧的常見(jiàn)面試題 ? ? ? ?虛擬機(jī)包含三大部分,類加載子系統(tǒng),運(yùn)行時(shí)數(shù)據(jù)區(qū),執(zhí)行引擎。運(yùn)行時(shí)數(shù)據(jù)區(qū)又包含方法區(qū),堆區(qū),棧區(qū),程序計(jì)數(shù)器,

    2024年02月11日
    瀏覽(23)
  • JVM內(nèi)存管理、內(nèi)存分區(qū):堆、方法區(qū)、虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器

    JVM內(nèi)存管理、內(nèi)存分區(qū):堆、方法區(qū)、虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器

    線程共享 堆 ????????存放 實(shí)例 ,字符串常量(直接引用),靜態(tài)變量,線程分配緩沖區(qū)(TLAB線程私有)。 垃圾收集器 管理的區(qū)域 方法區(qū) ????????非堆,和堆相對(duì)的概念。存儲(chǔ)已被虛擬機(jī)加載的 類型信息 、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼緩存等數(shù)據(jù),內(nèi)

    2024年02月10日
    瀏覽(22)
  • 什么時(shí)候會(huì)觸發(fā)FullGC?描述一下JVM加載class文件的原理機(jī)制?

    什么時(shí)候會(huì)觸發(fā) FullGC? 除直接調(diào)用 System.gc 外,觸發(fā) Full GC 執(zhí)行的情況有如下四種。 1. 舊生代空間不足 舊生代空間只有 在新生代對(duì)象轉(zhuǎn)入及創(chuàng)建為大對(duì)象、大數(shù)組時(shí)才會(huì)出現(xiàn)不足的現(xiàn)象,當(dāng)執(zhí)行 Full GC 后空間仍然不 足,則拋出如下錯(cuò)誤: java.lang.OutOfMemoryError: Java heap spac

    2024年02月20日
    瀏覽(24)
  • 虛擬機(jī)棧概述

    ????????由于跨平臺(tái)性的設(shè)計(jì),Java的指令都是根據(jù)棧來(lái)設(shè)計(jì)的。不同平臺(tái)CPU架構(gòu)不同,所以不能設(shè)計(jì)為基于寄存器的。 優(yōu)點(diǎn)是跨平臺(tái),指令集小,編譯器容易實(shí)現(xiàn), 缺點(diǎn)是性能下降,實(shí)現(xiàn)同樣的功能需要更多的指令。 1.2.1、虛擬機(jī)棧概念 ????????Java虛擬機(jī)棧(Java

    2024年02月05日
    瀏覽(19)
  • 4. 虛擬機(jī)棧

    4. 虛擬機(jī)棧

    由于跨平臺(tái)性的設(shè)計(jì),Java的指令都是根據(jù)棧來(lái)設(shè)計(jì)的。不同平臺(tái)CPU架構(gòu)不同,所以不能設(shè)計(jì)為基于寄存器的。 優(yōu)點(diǎn)是跨平臺(tái),指令集小,編譯器容易實(shí)現(xiàn),缺點(diǎn)是性能下降,實(shí)現(xiàn)同樣的功能需要更多的指令。 有不少Java開(kāi)發(fā)人員一提到Java內(nèi)存結(jié)構(gòu),就會(huì)非常粗粒度地將JVM中

    2024年02月09日
    瀏覽(19)
  • 什么是Java中的JVM(Java虛擬機(jī))?

    什么是Java中的JVM(Java虛擬機(jī))?

    JVM(Java虛擬機(jī))是Java平臺(tái)的核心組件之一,是一個(gè)用于執(zhí)行Java字節(jié)碼的虛擬計(jì)算機(jī)。Java源代碼經(jīng)過(guò)編譯器編譯,生成字節(jié)碼文件(.class文件),然后由JVM來(lái)解釋和執(zhí)行這些字節(jié)碼。JVM負(fù)責(zé)將字節(jié)碼翻譯成特定操作系統(tǒng)和硬件平臺(tái)的機(jī)器碼,從而實(shí)現(xiàn)跨平臺(tái)的能力。 ? JVM具

    2024年02月15日
    瀏覽(21)
  • 第一件事 什么是 Java 虛擬機(jī) (JVM)

    第一件事 什么是 Java 虛擬機(jī) (JVM)

    1、什么是虛擬機(jī)? - 這個(gè)其實(shí)是一個(gè)挺逗的事情,說(shuō)白了,就是基于某個(gè)硬件架構(gòu),在這個(gè)硬件部署了一個(gè)操作系統(tǒng),再構(gòu)架一層虛擬的操作系統(tǒng),這個(gè)新構(gòu)架的操作系統(tǒng)就是虛擬機(jī)。 不知道的兄弟姐妹們,可以去看看 VMWARE 這個(gè)軟件,它可以在很多常用操作系統(tǒng)上面構(gòu)建很

    2024年02月21日
    瀏覽(20)
  • 運(yùn)行時(shí)內(nèi)存數(shù)據(jù)區(qū)之虛擬機(jī)?!僮鲾?shù)棧

    運(yùn)行時(shí)內(nèi)存數(shù)據(jù)區(qū)之虛擬機(jī)?!僮鲾?shù)棧

    每一個(gè)獨(dú)立的棧幀中除了包含局部變量表以外,還包含一個(gè)后進(jìn)先出(Last-In-First-Out)的操作數(shù)棧,也可以稱之為表達(dá)式棧(Expression Stack)。 操作數(shù)棧,在方法執(zhí)行過(guò)程中,根據(jù)字節(jié)碼指令,往棧中寫(xiě)入數(shù)據(jù)或提取數(shù)據(jù),即入棧(push)/出棧(pop)。 某些字節(jié)碼指令將值壓入操作數(shù)棧,

    2023年04月12日
    瀏覽(94)
  • 【JVM故障問(wèn)題排查心得】「Java技術(shù)體系方向」Java虛擬機(jī)內(nèi)存優(yōu)化之虛擬機(jī)參數(shù)調(diào)優(yōu)原理介紹

    【JVM故障問(wèn)題排查心得】「Java技術(shù)體系方向」Java虛擬機(jī)內(nèi)存優(yōu)化之虛擬機(jī)參數(shù)調(diào)優(yōu)原理介紹

    本文主要針對(duì)于綜合層面上進(jìn)行分析JVM優(yōu)化方案總結(jié)和列舉調(diào)優(yōu)參數(shù)計(jì)劃。主要包含: 調(diào)優(yōu)之逃逸分析(棧上分配) 調(diào)優(yōu)之線程局部緩存(TLAB) 調(diào)優(yōu)之G1回收器 -XX:+DoEscapeAnalysis 逃逸分析(Escape Analysis) 逃逸分析的基本行為就是分析對(duì)象動(dòng)態(tài)作用域:當(dāng)一個(gè)對(duì)象在方法中被定

    2024年01月25日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包