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

JVM內(nèi)存模型/運行時數(shù)據(jù)區(qū)域

這篇具有很好參考價值的文章主要介紹了JVM內(nèi)存模型/運行時數(shù)據(jù)區(qū)域。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

java虛擬機管理這塊內(nèi)存,所以我們也叫運行時數(shù)據(jù)區(qū)域

總覽

JVM內(nèi)存模型/運行時數(shù)據(jù)區(qū)域,JVM,jvm,java
這里按線程是否共享來分類,所謂線程不共享就是每個線程里面都會配一套 程序計數(shù)器 棧, 互相不干涉。
而方法區(qū)和堆是線程所有共享 意味著只有一個(這里注意堆是實際概念 方法區(qū)是一個虛擬概念)

程序計數(shù)器

JVM內(nèi)存模型/運行時數(shù)據(jù)區(qū)域,JVM,jvm,java


注意:程序計數(shù)器記錄字節(jié)碼的內(nèi)存地址,這個內(nèi)存地址是怎么來的?
在前幾篇中 字節(jié)碼通過 .class文件 由類加載器 加載到方法區(qū)中(在解析那一步 將引用地址替換成堆內(nèi)存里面的內(nèi)存地址)
如下:
JVM內(nèi)存模型/運行時數(shù)據(jù)區(qū)域,JVM,jvm,java

字節(jié)碼中每一行都用地址標(biāo)識,程序計數(shù)器就像是一個地址指示器,告訴執(zhí)行程序 下一行去執(zhí)行哪里。

java虛擬機的多線程是線程輪流切換 并分配處理器執(zhí)行時間的方式來實現(xiàn)的,在任何一個確定的時刻,處理器只會執(zhí)行一條線程中的指令。 所以 為了線程切換后能恢復(fù)到正常位置 每個線程都需要一個獨立的程序計數(shù)器,這就是為什么 程序計數(shù)器不能像堆 方法區(qū)那樣 多線程共享

這篇博客的讀者 一定要理解透這一點。


java虛擬機棧

JVM內(nèi)存模型/運行時數(shù)據(jù)區(qū)域,JVM,jvm,java

棧這個數(shù)據(jù)結(jié)構(gòu)是個單向的,你可以把它想象成一個豎著的一邊開口的箱子。它是先進后出。

看上圖的Demo: main 調(diào)用a , a調(diào)用b ,b調(diào)用c。

那么在棧里面就是 mian 先入棧,后面依次是 a b c 入棧, 然后c先被執(zhí)行完 執(zhí)行完之后 c 出棧,后面 b a main 依次出棧。

這個時候新手可能會蒙蔽一下:a 調(diào)用 b 不是a先執(zhí)行嗎? 這里要注意,執(zhí)行b方法 這個過程是 執(zhí)行a方法中的一部分,a調(diào)用b的時候a開始執(zhí)行 但是沒執(zhí)行完 b執(zhí)行完之后 還在a的方法里面 再往下走 a才執(zhí)行完


上面就是方法執(zhí)行過程中棧的邏輯,每執(zhí)行一個方法 就是一個棧內(nèi)部棧幀入棧和出棧的過程。

然后我們來學(xué)習(xí)一下 java虛擬機棧內(nèi)部一個棧幀由哪些組成:

局部變量表
局部變量表里面存放著,運行過程中所有的局部變量,我們知道 每執(zhí)行一個方法就會創(chuàng)建一個棧幀,那么這個方法里面的局部變量自然要存入棧幀里面,所以在棧幀里面就創(chuàng)建一個局部變量表來專門存儲這些局部變量,方法結(jié)束 棧幀也就出棧結(jié)束了。

順便說一句 一個方法一般都會有 方法參數(shù),參數(shù)變量也會存在這里。

操作數(shù)棧
操作數(shù)棧你可以把它理解成一個臨時存放數(shù)據(jù)的區(qū)域,虛擬機在執(zhí)行字節(jié)碼指令的時候 需要把一些數(shù)據(jù)臨時存起來備用,
比如我們交換 a和 b的值 在計算機里面 你需要把a的值先臨時放到某個地方 然后把b的值給a 再從那個臨時存放點 把a的值拿出來給b
這種執(zhí)行指令時留的一點余地 就是操作數(shù)棧的作用

幀數(shù)據(jù)
幀數(shù)據(jù)不同的虛擬機有差異
這里面最主要的需要了解的兩個:

  • 動態(tài)鏈接:在字節(jié)碼指令中,一個類可能需要調(diào)用其他類的方法或者屬性,這時候就需要用動態(tài)鏈接 用一個映射把其他類的方法信息引進來
  • 方法出口:上面說過一個方法執(zhí)行完 就是一個棧彈出的過程,但是彈出以后 虛擬機會疑惑 此時線程執(zhí)行到哪里了?? 這里就需要在方法出口中記錄方法執(zhí)行完后 下一步的位置信息。

本地方法棧

本地方法棧和虛擬機棧發(fā)揮的作用很相似,只不過虛擬棧針對的是java代碼編譯后的字節(jié)碼

本地方法棧針對的是 虛擬機本身的底層已經(jīng)編寫好的 native 方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-800248.html

到了這里,關(guān)于JVM內(nèi)存模型/運行時數(shù)據(jù)區(qū)域的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • JVM | Java內(nèi)存區(qū)域

    JVM | Java內(nèi)存區(qū)域

    以上筆記基于JavaGuide整理 JDK 1.8: 線程私有 的:程序計數(shù)器,虛擬機棧,本地方法棧 線程共享 的:堆,方法區(qū)(元空間),直接內(nèi)存 (非運行時數(shù)據(jù)區(qū)的一部分) 程序計數(shù)器有兩個作用: 字節(jié)碼解釋器通過改變程序計數(shù)器來依次讀取指令,從而 實現(xiàn)代碼的流程控制 ,如:順

    2024年02月08日
    瀏覽(26)
  • JVM——Java 內(nèi)存區(qū)域詳解

    JVM——Java 內(nèi)存區(qū)域詳解

    如果沒有特殊說明,都是針對的是 HotSpot 虛擬機。 基本問題 介紹下 Java 內(nèi)存區(qū)域(運行時數(shù)據(jù)區(qū)) Java 對象的創(chuàng)建過程(五步,建議能默寫出來并且要知道每一步虛擬機做了什么) 對象的訪問定位的兩種方式(句柄和直接指針兩種方式) 拓展問題 String 類和常量池 8 種基本

    2024年02月13日
    瀏覽(20)
  • JVM篇--Java內(nèi)存區(qū)域高頻面試題

    JVM篇--Java內(nèi)存區(qū)域高頻面試題

    首先我們要知道java堆空間的產(chǎn)生過程: 即當(dāng)通過java命令啟動java進程的時候,就會為它分配內(nèi)存,而分配內(nèi)存的一部分就會用于創(chuàng)建堆空間,而當(dāng)程序中創(chuàng)建對象的時候 就會從堆空間來分配內(nèi)存,所以堆空間存放的主要是對象和數(shù)組; 而GC 其實說白了就是java虛擬機回收對象

    2024年02月01日
    瀏覽(57)
  • Java內(nèi)存區(qū)域(運行時數(shù)據(jù)區(qū)域)和內(nèi)存模型(JMM)

    Java內(nèi)存區(qū)域(運行時數(shù)據(jù)區(qū)域)和內(nèi)存模型(JMM)

    Java?內(nèi)存區(qū)域和內(nèi)存模型是不一樣的東西,內(nèi)存區(qū)域是指 Jvm 運行時將數(shù)據(jù)分區(qū)域存儲,強調(diào)對內(nèi)存空間的劃分。 而內(nèi)存模型(Java Memory?Model,簡稱 JMM )是定義了線程和主內(nèi)存之間的抽象關(guān)系,即 JMM 定義了 JVM 在計算機內(nèi)存(RAM)中的工作方式,如果我們要想深入了解Java并發(fā)

    2024年02月12日
    瀏覽(32)
  • 深入理解 JVM 之——Java 內(nèi)存區(qū)域與溢出異常

    深入理解 JVM 之——Java 內(nèi)存區(qū)域與溢出異常

    更好的閱讀體驗 huge{color{red}{更好的閱讀體驗}} 更好的閱讀體驗 本篇為深入理解 Java 虛擬機第二章內(nèi)容,推薦在學(xué)習(xí)前先掌握基礎(chǔ)的 Linux 操作、編譯原理、計算機組成原理等計算機基礎(chǔ)以及扎實的 C/C++ 功底。 該系列的 GitHub 倉庫:https://github.com/Doge2077/learn-jvm Java 虛擬機在

    2024年02月09日
    瀏覽(22)
  • JVM - 運行時數(shù)據(jù)區(qū)域

    JVM - 運行時數(shù)據(jù)區(qū)域

    并發(fā)情況下,會發(fā)生線程之間的上下文切換,當(dāng) 線程1 的CPU時間片用完后,需要程序計數(shù)器記錄 線程1 的下一條JVM指令的地址,等下一次 線程1 繼續(xù)運行的時,才能從正確的位置開始繼續(xù)執(zhí)行 程序計數(shù)器是線程私有的 , 既 一個線程計數(shù)器 記錄一個 線程 的指令位置 而且程

    2024年02月15日
    瀏覽(19)
  • JVM原理:JVM運行時內(nèi)存模型(通俗易懂)

    JVM原理:JVM運行時內(nèi)存模型(通俗易懂)

    做了幾年開發(fā),平時除了寫代碼造BUG和修復(fù)BUG之外,偶爾也會遇到反饋說程序較慢問題,要對程序性能排查與優(yōu)化就得更深入學(xué)習(xí),學(xué)習(xí)JVM可以幫助我們加深對JAVA的理解,讓我們具備一定的性能排查與調(diào)優(yōu)的能力,無非就是讓程序別太卡或者別掛了,那掛了目前我遇到的主要

    2024年02月08日
    瀏覽(34)
  • JVM運行時五大數(shù)據(jù)區(qū)域詳解

    JVM運行時五大數(shù)據(jù)區(qū)域詳解

    ? ? ? ? java虛擬機再執(zhí)行Java程序的時候把它所擁有的內(nèi)存區(qū)域劃分了若干個數(shù)據(jù)區(qū)域。這些區(qū)域有著不同的功能,各司其職。這些區(qū)域不但功能不同,創(chuàng)建、銷毀時間也不同。有些區(qū)域為線程私有,如:每個線程都有自己的程序計數(shù)器,則程序計數(shù)器隨著用戶線程創(chuàng)建而創(chuàng)

    2024年02月13日
    瀏覽(25)
  • JVM零基礎(chǔ)到高級實戰(zhàn)之Java內(nèi)存區(qū)域本地方法棧

    JVM零基礎(chǔ)到高級實戰(zhàn)之Java內(nèi)存區(qū)域本地方法棧 JVM零基礎(chǔ)到高級實戰(zhàn)之Java內(nèi)存區(qū)域本地方法棧 本地方法棧是什么? 用于作用域本地方法執(zhí)行的一塊Java內(nèi)存區(qū)域 為什么要有本地方法棧? 與Java虛擬機棧相同,每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀(Stack Framel)用于存儲局部

    2024年02月09日
    瀏覽(13)
  • JVM運行時數(shù)據(jù)區(qū)——堆內(nèi)的區(qū)域分布

    JVM運行時數(shù)據(jù)區(qū)——堆內(nèi)的區(qū)域分布

    1.堆內(nèi)的區(qū)域分布 堆是運行時數(shù)據(jù)區(qū) 最大 的一塊區(qū)域, 主要用來存放對象 ,堆是所有 線程公用 的,在JVM 啟動時就被創(chuàng)建 ,堆的 空間是可以調(diào)整 的,是GC(垃圾回收)的 重點區(qū)域 。 堆的內(nèi)存空間分區(qū):新生代+老年代 新生代又分為Eden(伊甸園)和Survivor(幸存者)區(qū)。 ?

    2024年02月16日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包