91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

深入淺出 JVM ? 來(lái)源:深入淺出 JVM ? 作者:深入淺出 JVM ? 2022-03-01 14:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

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

二、棧存儲(chǔ)

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

這里寫圖片描述

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

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

這里寫圖片描述

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

在每個(gè)方法執(zhí)行的時(shí)候,都會(huì)創(chuàng)建一個(gè)個(gè)的棧幀,用于保存局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接等信息(以后都會(huì)詳細(xì)講解)。每次方法的調(diào)用都會(huì)對(duì)應(yīng)著一個(gè)棧幀,因此可以解釋當(dāng)我們?cè)趯戇f歸程序的時(shí)候會(huì)不小心報(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ī)會(huì)自動(dòng)釋放掉為該棧所分配的空間,在棧中,對(duì)應(yīng)著一個(gè)棧幀的出棧。虛擬機(jī)會(huì)自動(dòng)分配與回收內(nèi)存,因此效率比較高。

三、總結(jié)

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

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

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

四、拓展閱讀

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

審核編輯:符乾江

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

    關(guān)注

    20

    文章

    3001

    瀏覽量

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

    關(guān)注

    1

    文章

    972

    瀏覽量

    30458
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    軟通動(dòng)力以全智能重塑中國(guó)科技企業(yè)全球化競(jìng)爭(zhēng)新優(yōu)勢(shì)

    1月6日至9日,在CES 2026全球科技盛會(huì)期間,軟通動(dòng)力國(guó)際業(yè)務(wù)總裁黃立接受鈦媒體創(chuàng)始人趙何娟的獨(dú)家專訪。雙方圍繞中國(guó)科技企業(yè)的全球化進(jìn)階路徑、全智能戰(zhàn)略布局以及如何在復(fù)雜的國(guó)際環(huán)境中實(shí)現(xiàn)
    的頭像 發(fā)表于 01-14 15:10 ?443次閱讀

    2026年度《電子元件與電路設(shè)計(jì)進(jìn)階:案例分析與故障解決》公開課杭州來(lái)襲!

    、電容、電感、磁珠到半導(dǎo)體器件二極管、三極管、MOSFET,課程不僅講解基礎(chǔ)概念,更側(cè)重于進(jìn)階應(yīng)用與案例分析,確保知識(shí)的實(shí)用性與深度。2、系統(tǒng)化的電源電路設(shè)計(jì)指導(dǎo)
    的頭像 發(fā)表于 12-20 10:03 ?536次閱讀
    2026年度《電子元件與電路設(shè)計(jì)<b class='flag-5'>進(jìn)階</b>:案例分析與故障解決》公開課杭州來(lái)襲!

    第8章 函數(shù)進(jìn)階與按鍵(8.1 8.2)

    函數(shù)的進(jìn)階知識(shí)。 8.1?單片機(jī)最小系統(tǒng)解析 8.1.1?電源 學(xué)習(xí)過(guò)程中,很多指標(biāo)都是直接用的概念指標(biāo),比如說(shuō)+5V代表1,GND代表0等等。但在實(shí)際電路中的電壓值并不是完全精準(zhǔn)的,那這些指標(biāo)允許范圍是什么呢?隨著學(xué)習(xí)的內(nèi)
    的頭像 發(fā)表于 12-18 11:27 ?308次閱讀
    第8章 函數(shù)<b class='flag-5'>進(jìn)階</b>與按鍵(8.1 8.2)

    ETAS INCA軟件的五個(gè)實(shí)用進(jìn)階功能

    在上篇文章中我們介紹了INCA軟件如何賦能高效的ECU開發(fā)及新能源挑戰(zhàn),本篇內(nèi)容將繼續(xù)深入探討INCA的五個(gè)實(shí)用進(jìn)階功能。
    的頭像 發(fā)表于 12-08 16:42 ?2363次閱讀
    ETAS INCA軟件的五個(gè)實(shí)用<b class='flag-5'>進(jìn)階</b>功能

    Stack到底用來(lái)干嘛的呢?

    我們?cè)诤瘮?shù)的局部變量、數(shù)組這些不能超過(guò)1K(含嵌套的函數(shù)),否則程序就會(huì)崩潰進(jìn)入hardfaul。 除了這些局部變量以外,還有些實(shí)時(shí)操作系統(tǒng)的現(xiàn)場(chǎng)保護(hù)、返回地址都是存儲(chǔ)在里面。 還有點(diǎn)題外話,就是
    發(fā)表于 12-01 08:04

    Arm Neoverse CPU上大代碼量Java應(yīng)用的性能測(cè)試

    Java 是互聯(lián)網(wǎng)領(lǐng)域廣泛使用的編程語(yǔ)言。Java 應(yīng)用的些特性使其性能表現(xiàn)與提前編譯的原生應(yīng)用(例如 C 程序)大相徑庭。由于 Java 字節(jié)碼無(wú)法直接在 CPU 上執(zhí)行,因此通常
    的頭像 發(fā)表于 11-05 11:25 ?745次閱讀
    Arm Neoverse CPU上大代碼量<b class='flag-5'>Java</b>應(yīng)用的性能測(cè)試

    Java效率提升指南:5個(gè)Java工具選型建議及Perforce JRebel和XRebel介紹

    企業(yè)級(jí)Java環(huán)境越來(lái)越復(fù)雜,真正的破局點(diǎn),可能不在“人”,而在于“工具”。5個(gè)實(shí)用建議,幫你理清Java工具的選型思路。
    的頭像 發(fā)表于 09-11 13:59 ?1470次閱讀
    <b class='flag-5'>Java</b>效率提升指南:5個(gè)<b class='flag-5'>Java</b>工具選型建議及Perforce JRebel和XRebel介紹

    自動(dòng)駕駛中常提的“全”是個(gè)啥?有必要“全”嗎?

    和應(yīng)用,涵蓋從底層硬件、感知算法、高精地圖、定位與融合,到?jīng)Q策規(guī)劃、控制執(zhí)行、軟件平臺(tái),乃至整車集成與云端服務(wù)的完整鏈條。對(duì)于希望在激烈的市場(chǎng)競(jìng)爭(zhēng)中占據(jù)席之地的車企和科技公司來(lái)說(shuō),全似乎代表了掌握核心競(jìng)爭(zhēng)
    的頭像 發(fā)表于 08-27 09:43 ?1126次閱讀
    自動(dòng)駕駛中常提的“全<b class='flag-5'>棧</b>”是個(gè)啥?有必要“全<b class='flag-5'>棧</b>”嗎?

    Java開發(fā)必備】IntelliJ IDEA數(shù)據(jù)庫(kù)功能進(jìn)階指南:9個(gè)JetBrains工程師私藏技巧

    想提升涉及數(shù)據(jù)庫(kù)的Java開發(fā)效率?IntelliJ IDEA為您帶來(lái)了9大進(jìn)階招式!無(wú)論您是剛剛啟動(dòng)新項(xiàng)目,還是正在深入優(yōu)化現(xiàn)有系統(tǒng),這些實(shí)用技巧都將助您事半功倍。
    的頭像 發(fā)表于 05-21 17:04 ?748次閱讀
    【<b class='flag-5'>Java</b>開發(fā)必備】IntelliJ IDEA數(shù)據(jù)庫(kù)功能<b class='flag-5'>進(jìn)階</b>指南:9個(gè)JetBrains工程師私藏技巧

    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階篇-進(jìn)階7 向系統(tǒng)中添加個(gè)系統(tǒng)調(diào)用

    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)進(jìn)階篇-進(jìn)階7 向系統(tǒng)中添加個(gè)系統(tǒng)調(diào)用
    的頭像 發(fā)表于 05-21 14:15 ?700次閱讀
    RK3568驅(qū)動(dòng)指南|驅(qū)動(dòng)基礎(chǔ)<b class='flag-5'>進(jìn)階</b>篇-<b class='flag-5'>進(jìn)階</b>7 向系統(tǒng)中添加<b class='flag-5'>一</b>個(gè)系統(tǒng)調(diào)用

    開發(fā)進(jìn)階指南:LuatOS-log庫(kù)從入門到實(shí)戰(zhàn)!

    本文將帶你深入探索LuatOS系統(tǒng)中l(wèi)og庫(kù)的核心原理與實(shí)戰(zhàn)技巧,通過(guò)代碼示例解析日志管理、錯(cuò)誤追蹤及性能優(yōu)化的最佳實(shí)踐,助力全工程師構(gòu)建更穩(wěn)健的物聯(lián)網(wǎng)應(yīng)用。 今天,我們起來(lái)認(rèn)識(shí)LuatOS
    的頭像 發(fā)表于 05-15 16:12 ?2853次閱讀
    全<b class='flag-5'>棧</b>開發(fā)<b class='flag-5'>進(jìn)階</b>指南:LuatOS-log庫(kù)從入門到實(shí)戰(zhàn)!

    Altium Designer PCB設(shè)計(jì)高級(jí)進(jìn)階

    對(duì)PCB設(shè)計(jì)的高級(jí)進(jìn)階的內(nèi)容進(jìn)行相關(guān)的介紹 純分享貼,有需要可以直接下載附件獲取完整資料! (如果內(nèi)容有幫助可以關(guān)注、點(diǎn)贊、評(píng)論支持下哦~)
    發(fā)表于 04-27 16:40

    Java開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多Java開發(fā)者在用?

    Perforce JRebel是Java開發(fā)效率工具,旨在幫助java開發(fā)人員更快地編寫更好的應(yīng)用程序。JRebel可即時(shí)重新加載對(duì)代碼的修改,無(wú)需重啟或重新部署應(yīng)用程序,就能讓開發(fā)者即時(shí)看到代碼更改的效果,從而縮短開發(fā)、調(diào)
    的頭像 發(fā)表于 04-27 13:44 ?834次閱讀
    <b class='flag-5'>Java</b>開發(fā)者必備的效率工具——Perforce JRebel是什么?為什么很多<b class='flag-5'>Java</b>開發(fā)者在用?

    Java 到 Go:面向?qū)ο蟮木奕伺c云原生的輕騎兵

    (Goroutine/Channel) 在 云原生基礎(chǔ)設(shè)施領(lǐng)域 占據(jù)主導(dǎo)地位,它也是 Java 開發(fā)者探索云原生技術(shù)的關(guān)鍵補(bǔ)
    的頭像 發(fā)表于 04-25 11:13 ?640次閱讀

    深入淺出解析低功耗藍(lán)牙協(xié)議

    Bluetooth LE協(xié)議為什么要分層?怎么理解Bluetooth LE“連接”?如果Bluetooth LE協(xié)議只有ATT層沒有GATT層會(huì)發(fā)生什么? 、協(xié)議框架 般而言,
    的頭像 發(fā)表于 04-09 14:49 ?1282次閱讀
    深入淺出解析低功耗藍(lán)牙協(xié)議<b class='flag-5'>棧</b>