0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JVM進(jìn)階知識(一):初識 JAVA 棧

深入淺出 JVM ? 來源:深入淺出 JVM ? 作者:深入淺出 JVM ? 2022-03-01 14:02 ? 次閱讀

一、前言

若想自己編寫的Java程序高效運(yùn)行,以及進(jìn)行正確、高效的異常診斷,JVM是不得不談的一個(gè)話題。本”JVM進(jìn)階“專欄大部分內(nèi)容均來源于經(jīng)典書籍《深入理解Java虛擬機(jī)》。

二、棧存儲

言歸正傳,本文重點(diǎn)從虛擬機(jī)內(nèi)存模型(運(yùn)行時(shí)數(shù)據(jù)區(qū)域)入手。先看下圖:

這里寫圖片描述

這是一張比較官方的虛擬機(jī)模型圖,今天講的就是虛線框中棧的部分。

棧是我們最常用的內(nèi)存區(qū)域。它主要用來存放基本類型變量,局部變量以及對象的引用。例如:User user = new User();這里的user就是對象的引用也可以理解為地址,指引著虛擬機(jī)要去哪里找user這個(gè)對象。 他們的基本關(guān)系如圖:

這里寫圖片描述

由上圖可知,當(dāng)我們將一個(gè)對象作為方法的參數(shù)時(shí),我們在方法中改變對象的值,也會影響到原來對象的值,因?yàn)槲覀冎皇歉淖兞藞D中內(nèi)存區(qū)域的值,他的指引(地址)還是一樣的。同時(shí)也可以看出,棧的內(nèi)存區(qū)域是連續(xù)的,有大小限制的,如果超過了就會拋出棧溢出的異常StackOverflowError。

在每個(gè)方法執(zhí)行的時(shí)候,都會創(chuàng)建一個(gè)個(gè)的棧幀,用于保存局部變量表,操作數(shù)棧,動態(tài)鏈接等信息(以后都會詳細(xì)講解)。每次方法的調(diào)用都會對應(yīng)著一個(gè)棧幀,因此可以解釋當(dāng)我們在寫遞歸程序的時(shí)候會不小心報(bào)棧溢出的異常,因?yàn)闂J怯邢薜?,方法調(diào)用太多次導(dǎo)致棧幀堆滿了棧,所以溢出??聪旅娲a:

public class Test {
private static int stackLength = 0;
private static void main(String[] args) {
 try {
  Test test = new Test();
  test.stackOverFlow();
 } catch (Throwable e) {
  System.out.println("stackLength:" + stackLength);
  throw e;
 }
}
public void stackOverFlow() {
 // 瘋狂遞歸調(diào)用
 stackLength++;
 stackOverFlow();
}
}


在參數(shù)-Xss128k的情況下的報(bào)錯(cuò)。(eclipse中設(shè)置參數(shù):右鍵代碼選擇Run As-->Run Configurations,在Arguments欄下的VM arguments中填入?yún)?shù),再Apply,再run)

這里寫圖片描述

每次在方法執(zhí)行完畢的時(shí)候,虛擬機(jī)會自動釋放掉為該棧所分配的空間,在棧中,對應(yīng)著一個(gè)棧幀的出棧。虛擬機(jī)會自動分配與回收內(nèi)存,因此效率比較高。

三、總結(jié)

最后做一下棧的總結(jié):

存放基本類型變量,局部變量,對象的引用;
系統(tǒng)自動分配與回收內(nèi)存,效率較高,快速,存取速度比堆要快;
是一塊連續(xù)的內(nèi)存的區(qū)域,有大小限制,如果超過了就會棧溢出,并拋出棧溢出的異常StackOverflowError;
Java會自動釋放掉為該變量所分配的內(nèi)存空間;
棧又分為java棧和本地方法棧。顧名思義,本地方法棧自然就是為本地方法提供服務(wù)的,java棧是為java服務(wù)的。

注意??:JVM棧是每個(gè)線程私有的!

四、拓展閱讀

《JVM虛擬機(jī)專欄》

審核編輯:符乾江

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2943

    瀏覽量

    104103
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    888

    瀏覽量

    27813
收藏 人收藏

    評論

    相關(guān)推薦

    從原理聊JVM):染色標(biāo)記和垃圾回收算法

    導(dǎo)讀 JAVA簡單易用的特性,能夠讓研發(fā)人員在不了解JVM的底層運(yùn)行機(jī)制的情況下依舊能夠編寫出功能完善的代碼。 但是對JVM的理解,是個(gè)程序員普通和優(yōu)秀的分水嶺。全面地了解
    的頭像 發(fā)表于 08-20 15:25 ?90次閱讀
    從原理聊<b class='flag-5'>JVM</b>(<b class='flag-5'>一</b>):染色標(biāo)記和垃圾回收算法

    聊聊JVM如何優(yōu)化

    進(jìn)行優(yōu)化。 1.JVM內(nèi)存模型 針對JAVA8的模型進(jìn)行討論,JVM的內(nèi)存模型主要分為幾個(gè)關(guān)鍵區(qū)域:堆、方法區(qū)、程序計(jì)數(shù)器、虛擬機(jī)和本地方法
    的頭像 發(fā)表于 08-05 17:49 ?317次閱讀
    聊聊<b class='flag-5'>JVM</b>如何優(yōu)化

    eclipse設(shè)置jvm內(nèi)存大小

    Eclipse是個(gè)功能強(qiáng)大的集成開發(fā)環(huán)境(IDE),常用于Java開發(fā)。為了保證Eclipse的性能和穩(wěn)定性,我們可以根據(jù)需要來設(shè)置JVM內(nèi)存大小。本文將詳細(xì)介紹如何在Eclipse中設(shè)置J
    的頭像 發(fā)表于 12-06 11:43 ?1581次閱讀

    weblogic設(shè)置jvm內(nèi)存大小

    WebLogic是Java EE應(yīng)用服務(wù)器,用于構(gòu)建和部署企業(yè)級Java應(yīng)用程序。在配置WebLogic服務(wù)器時(shí),設(shè)置JVM的內(nèi)存大小非常重要,這可以提高應(yīng)用程序的性能和可靠性。本
    的頭像 發(fā)表于 12-05 14:44 ?2641次閱讀

    jvm和jmm的區(qū)別

    JVMJava Virtual Machine)和JMM(Java Memory Model)是 Java 開發(fā)者非常熟悉的概念。JVM
    的頭像 發(fā)表于 12-05 14:27 ?1095次閱讀

    jvm配置metaspace最大值的參數(shù)

    JVMJava虛擬機(jī))是Java程序的運(yùn)行環(huán)境,而Metaspace是Java 8及其更高版本中引入的種新的內(nèi)存區(qū)域,用于存儲類的元數(shù)據(jù)
    的頭像 發(fā)表于 12-05 14:21 ?1513次閱讀

    java虛擬機(jī)內(nèi)存包括遠(yuǎn)空間內(nèi)存嗎

    Java虛擬機(jī)(JVM)內(nèi)存是Java程序執(zhí)行時(shí)所使用的內(nèi)存空間的總稱,包括了Java堆、方法區(qū)、本地方法、虛擬機(jī)
    的頭像 發(fā)表于 12-05 14:15 ?308次閱讀

    jvm內(nèi)存區(qū)域中,哪塊是屬于線程共享

    是如何劃分的。JVM內(nèi)存區(qū)域主要分為以下幾個(gè)部分:程序計(jì)數(shù)器、Java虛擬機(jī)、本地方法、堆、方法區(qū)和運(yùn)行時(shí)常量池。其中,程序計(jì)數(shù)器、Java
    的頭像 發(fā)表于 12-05 14:14 ?1092次閱讀

    jvm內(nèi)存區(qū)域由哪幾部分組成

    JVMJava Virtual Machine)是Java程序運(yùn)行的環(huán)境,在JVM中存在著多個(gè)不同功能的內(nèi)存區(qū)域。這些內(nèi)存區(qū)域可以被分為幾個(gè)部分,包括堆內(nèi)存、
    的頭像 發(fā)表于 12-05 14:10 ?652次閱讀

    jvm運(yùn)行時(shí)內(nèi)存區(qū)域劃分

    JVMJava Virtual Machine(Java虛擬機(jī))的縮寫,它是Java編程語言的運(yùn)行環(huán)境。JVM的主要功能是將
    的頭像 發(fā)表于 12-05 14:08 ?414次閱讀

    jvm參數(shù)的設(shè)置和jvm調(diào)優(yōu)

    JVMJava虛擬機(jī))參數(shù)的設(shè)置和調(diào)優(yōu)對于提高Java應(yīng)用程序的性能和穩(wěn)定性非常重要。在本文中,我們將詳細(xì)介紹JVM參數(shù)的設(shè)置和調(diào)優(yōu)方法。
    的頭像 發(fā)表于 12-05 11:36 ?1047次閱讀

    jvm調(diào)優(yōu)參數(shù)

    JVMJava虛擬機(jī))是Java程序的運(yùn)行環(huán)境,它負(fù)責(zé)解釋Java字節(jié)碼并執(zhí)行相應(yīng)的指令。為了提高應(yīng)用程序的性能和穩(wěn)定性,我們可以調(diào)優(yōu)JVM
    的頭像 發(fā)表于 12-05 11:29 ?519次閱讀

    jvm內(nèi)存模型和內(nèi)存結(jié)構(gòu)

    JVMJava虛擬機(jī))是Java程序的運(yùn)行平臺,它負(fù)責(zé)將Java程序轉(zhuǎn)換成機(jī)器碼并在計(jì)算機(jī)上執(zhí)行。在JVM中,內(nèi)存模型和內(nèi)存結(jié)構(gòu)是兩個(gè)重要
    的頭像 發(fā)表于 12-05 11:08 ?733次閱讀

    JVM指針壓縮的工作原理

    當(dāng)今,Java已經(jīng)成為了世界上最流行的編程語言之。在Java的生態(tài)系統(tǒng)中,JVMJava虛擬機(jī))是至關(guān)重要的組成部分。
    的頭像 發(fā)表于 10-16 15:08 ?617次閱讀
    <b class='flag-5'>JVM</b>指針壓縮的工作原理

    JVM知識體系剖析

    從源碼到運(yùn)行、類加載,再到內(nèi)存分配和垃圾回收,以及JVM調(diào)優(yōu)的技巧與實(shí)戰(zhàn)。 理論-實(shí)戰(zhàn)-面試三結(jié)合,帶大家剖析整個(gè)JVM知識體系,站解決JVM
    的頭像 發(fā)表于 10-10 11:37 ?363次閱讀
    <b class='flag-5'>JVM</b><b class='flag-5'>知識</b>體系剖析