精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

一、前言

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

二、棧存儲

言歸正傳,本文重點從虛擬機內存模型(運行時數據區域)入手。先看下圖:

這里寫圖片描述

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

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

這里寫圖片描述

由上圖可知,當我們將一個對象作為方法的參數時,我們在方法中改變對象的值,也會影響到原來對象的值,因為我們只是改變了圖中內存區域的值,他的指引(地址)還是一樣的。同時也可以看出,棧的內存區域是連續的,有大小限制的,如果超過了就會拋出棧溢出的異常StackOverflowError。

在每個方法執行的時候,都會創建一個個的棧幀,用于保存局部變量表,操作數棧,動態鏈接等信息(以后都會詳細講解)。每次方法的調用都會對應著一個棧幀,因此可以解釋當我們在寫遞歸程序的時候會不小心報棧溢出的異常,因為棧是有限的,方法調用太多次導致棧幀堆滿了棧,所以溢出。看下面代碼:

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() {
 // 瘋狂遞歸調用
 stackLength++;
 stackOverFlow();
}
}


在參數-Xss128k的情況下的報錯。(eclipse中設置參數:右鍵代碼選擇Run As-->Run Configurations,在Arguments欄下的VM arguments中填入參數,再Apply,再run)

這里寫圖片描述

每次在方法執行完畢的時候,虛擬機會自動釋放掉為該棧所分配的空間,在棧中,對應著一個棧幀的出棧。虛擬機會自動分配與回收內存,因此效率比較高。

三、總結

最后做一下棧的總結:

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

注意??:JVM棧是每個線程私有的!

四、拓展閱讀

《JVM虛擬機專欄》

審核編輯:符乾江

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2957

    瀏覽量

    104544
  • 虛擬機
    +關注

    關注

    1

    文章

    908

    瀏覽量

    28086
收藏 人收藏

    評論

    相關推薦

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

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

    聊聊JVM如何優化

    進行優化。 1.JVM內存模型 針對JAVA8的模型進行討論,JVM的內存模型主要分為幾個關鍵區域:堆、方法區、程序計數器、虛擬機和本地方法
    的頭像 發表于 08-05 17:49 ?433次閱讀
    聊聊<b class='flag-5'>JVM</b>如何優化

    eclipse設置jvm內存大小

    Eclipse是個功能強大的集成開發環境(IDE),常用于Java開發。為了保證Eclipse的性能和穩定性,我們可以根據需要來設置JVM內存大小。本文將詳細介紹如何在Eclipse中設置J
    的頭像 發表于 12-06 11:43 ?1818次閱讀

    weblogic設置jvm內存大小

    WebLogic是Java EE應用服務器,用于構建和部署企業級Java應用程序。在配置WebLogic服務器時,設置JVM的內存大小非常重要,這可以提高應用程序的性能和可靠性。本
    的頭像 發表于 12-05 14:44 ?2972次閱讀

    jvm和jmm的區別

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

    jvm配置metaspace最大值的參數

    JVMJava虛擬機)是Java程序的運行環境,而Metaspace是Java 8及其更高版本中引入的種新的內存區域,用于存儲類的元數據
    的頭像 發表于 12-05 14:21 ?2006次閱讀

    java虛擬機內存包括遠空間內存嗎

    Java虛擬機(JVM)內存是Java程序執行時所使用的內存空間的總稱,包括了Java堆、方法區、本地方法、虛擬機
    的頭像 發表于 12-05 14:15 ?378次閱讀

    jvm內存區域中,哪塊是屬于線程共享

    是如何劃分的。JVM內存區域主要分為以下幾個部分:程序計數器、Java虛擬機、本地方法、堆、方法區和運行時常量池。其中,程序計數器、Java
    的頭像 發表于 12-05 14:14 ?1320次閱讀

    jvm內存區域由哪幾部分組成

    JVMJava Virtual Machine)是Java程序運行的環境,在JVM中存在著多個不同功能的內存區域。這些內存區域可以被分為幾個部分,包括堆內存、
    的頭像 發表于 12-05 14:10 ?786次閱讀

    jvm運行時內存區域劃分

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

    jvm調優工具有哪些

    JVM調優是提高Java應用程序性能的重要手段,而JVM調優工具則是輔助開發人員進行調優工作的利器。下面將介紹些常用的JVM調優工具。 J
    的頭像 發表于 12-05 11:44 ?1028次閱讀

    jvm參數的設置和jvm調優

    JVMJava虛擬機)參數的設置和調優對于提高Java應用程序的性能和穩定性非常重要。在本文中,我們將詳細介紹JVM參數的設置和調優方法。
    的頭像 發表于 12-05 11:36 ?1421次閱讀

    jvm調優參數

    JVMJava虛擬機)是Java程序的運行環境,它負責解釋Java字節碼并執行相應的指令。為了提高應用程序的性能和穩定性,我們可以調優JVM
    的頭像 發表于 12-05 11:29 ?598次閱讀

    jvm內存模型和內存結構

    JVMJava虛擬機)是Java程序的運行平臺,它負責將Java程序轉換成機器碼并在計算機上執行。在JVM中,內存模型和內存結構是兩個重要
    的頭像 發表于 12-05 11:08 ?893次閱讀

    jvm內存溢出該如何定位解決

    Java應用程序中,JVMJava虛擬機)內存溢出是指Java應用程序試圖分配的內存超過了JVM所允許的最大內存大小,導致程序無法正常執
    的頭像 發表于 12-05 11:05 ?1292次閱讀