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

【JVM】JVM五大內(nèi)存區(qū)域介紹

這篇具有很好參考價(jià)值的文章主要介紹了【JVM】JVM五大內(nèi)存區(qū)域介紹。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

?一、程序計(jì)數(shù)器(線程私有)

二、java虛擬機(jī)棧(線程私有)

2.1、虛擬機(jī)棧

2.2、棧相關(guān)測試

2.2.1、棧溢出

三、本地方法棧(線程私有)

四、java堆(線程共享)

五、方法區(qū)(線程共享)

六、實(shí)例演示


????????Java虛擬機(jī)在執(zhí)行Java程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。這些區(qū)域有各自的用途,以及創(chuàng)建和銷毀的時(shí)間,有的區(qū)域隨著虛擬機(jī)進(jìn)程的啟動而一直存在,有些區(qū)域則是依賴用戶線程的啟動和結(jié)束而建立和銷毀。

【JVM】JVM五大內(nèi)存區(qū)域介紹,jvm

?一、程序計(jì)數(shù)器(線程私有)

????????程序計(jì)數(shù)器(Program Counter Register)是一塊較小的內(nèi)存空間,它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指示器。在Java虛擬機(jī)的概念模型里 [1] ,字節(jié)碼解釋器工作時(shí)就是通過改變這個計(jì)數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,它是程序控制流的指示器,分支、循環(huán)、跳轉(zhuǎn)、異常處理、線程恢復(fù)等基礎(chǔ)功能都需要依賴這個計(jì)數(shù)器來完成。
????????由于Java虛擬機(jī)的多線程是通過線程輪流切換、分配處理器執(zhí)行時(shí)間的方式來實(shí)現(xiàn)的,在任何一個確定的時(shí)刻,一個處理器(對于多核處理器來說是一個內(nèi)核)都只會執(zhí)行一條線程中的指令。因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要有一個獨(dú)立的程序計(jì)數(shù)器,各條線程之間計(jì)數(shù)器互不影響,獨(dú)立存儲,我們稱這類內(nèi)存區(qū)域?yàn)椤熬€程私有”的內(nèi)存。

二、java虛擬機(jī)棧(線程私有)

2.1、虛擬機(jī)棧

????????與程序計(jì)數(shù)器一樣,Java虛擬機(jī)棧(Java Virtual Machine Stack)也是線程私有的,它的生命周期與線程相同。虛擬機(jī)棧描述的是Java方法執(zhí)行的線程內(nèi)存模型:每個方法被執(zhí)行的時(shí)候,Java虛擬機(jī)都會同步創(chuàng)建一個棧幀 [1] (Stack Frame)用于存儲局部變量表、操作數(shù)棧、動態(tài)連接、方法出口等信息。每一個方法被調(diào)用直至執(zhí)行完畢的過程,就對應(yīng)著一個棧幀在虛擬機(jī)棧中從入棧到出棧的過程。

????????“?!蓖ǔ>褪侵高@里講的虛擬機(jī)棧,或者更多的情況下只是指虛擬機(jī)棧中局部變量表部分。
局部變量表存放了編譯期可知的各種Java虛擬機(jī)基本數(shù)據(jù)類型(boolean、byte、char、short、int、float、long、double)、對象引用
(reference類型,它并不等同于對象本身,可能是一個指向?qū)ο笃鹗嫉刂返囊弥羔?,也可能是指向一個代表對象的句柄或者其他與此對象相關(guān)的位置)和returnAddress類型(指向了一條字節(jié)碼指令的地址)。
????????這些數(shù)據(jù)類型在局部變量表中的存儲空間以局部變量槽(Slot)來表示,其中64位長度的long和double類型的數(shù)據(jù)會占用兩個變量槽,其余的數(shù)據(jù)類型只占用一個。局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個方法時(shí),這個方法需要在棧幀中分配多大的局部變量空間是完全確定的,在方法運(yùn)行期間不會改變局部變量表的大小。請讀者注意,這里說的“大小”是指變量槽的數(shù)量,虛擬機(jī)真正使用多大的內(nèi)存空間(譬如按照1個變量槽占用32個比特、64個比特,或者更多)來實(shí)現(xiàn)一個變量槽,這是完全由具體的虛擬機(jī)實(shí)現(xiàn)自行決定的事情。

2.2、棧相關(guān)測試

2.2.1、棧溢出

測試類:

如果某個線程的線程棧的內(nèi)存被耗盡,沒有足夠的內(nèi)存資源去創(chuàng)建棧幀,就會發(fā)生內(nèi)存溢出。

public class TestStack {
    public static void main(String[] args) {
        test();
    }
    public static void test(){
        test();
    }
}

結(jié)果:

【JVM】JVM五大內(nèi)存區(qū)域介紹,jvm

????????上面這串代碼的執(zhí)行過程是:線程先執(zhí)行main方法,同時(shí)會創(chuàng)建main方法的棧幀插入到該線程的線程棧中,當(dāng)執(zhí)行到test()方法時(shí),創(chuàng)建test()方法的棧幀插入到該線程的線程棧中,執(zhí)行到test()方法里的test()方法時(shí),創(chuàng)建棧幀,插入到線程棧中,后面進(jìn)行不斷創(chuàng)建棧幀、入棧。當(dāng)創(chuàng)建一定數(shù)量的棧幀后,剩下的線程資源無法再創(chuàng)建新的棧幀就會報(bào)StackOverflowError異常(堆棧溢出異常)(當(dāng)前虛擬機(jī)棧不可以動態(tài)擴(kuò)展)

????????如果Java虛擬機(jī)棧容量可以動態(tài)擴(kuò)展,當(dāng)棧擴(kuò)展時(shí)無法申請到足夠的內(nèi)存會拋出OutOfMemoryError異常。

三、本地方法棧(線程私有)

????????本地方法棧(Native Method Stacks)與虛擬機(jī)棧所發(fā)揮的作用是非常相似的,其區(qū)別只是虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機(jī)使用到的本地(Native)方法服務(wù)。

四、java堆(線程共享)

????????Java堆是被所有線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動時(shí)創(chuàng)建。此內(nèi)存區(qū)域的唯一目的就是存放對象實(shí)例,Java世界里“幾乎”所有的對象實(shí)例都在這里分配內(nèi)存。

????????Java堆是垃圾收集器管理的內(nèi)存區(qū)域,因此一些資料中它也被稱作“GC堆”(Garbage CollectedHeap)。從回收內(nèi)存的角度看,由于現(xiàn)代垃圾收集器大部分都是基于分代收集理論設(shè)計(jì)的,所以Java堆中經(jīng)常會出現(xiàn)“新生代”“老年代”“永久代”“Eden空間”“From Survivor空間”“To Survivor空間”等名詞。

????????如果從分配內(nèi)存的角度看,所有線程共享的Java堆中可以劃分出多個線程私有的分配緩沖區(qū)
(Thread Local Allocation Buffer,TLAB)
,以提升對象分配時(shí)的效率。不過無論從什么角度,無論如何劃分,都不會改變Java堆中存儲內(nèi)容的共性,無論是哪個區(qū)域,存儲的都只能是對象的實(shí)例,將Java堆細(xì)分的目的只是為了更好地回收內(nèi)存,或者更快地分配內(nèi)存。

????????Java堆既可以被實(shí)現(xiàn)成固定大小的,也可以是可擴(kuò)展的,不過當(dāng)前主流的Java虛擬機(jī)都是按照可擴(kuò)展來實(shí)現(xiàn)的(通過參數(shù)-Xmx和-Xms設(shè)定)。如果在Java堆中沒有內(nèi)存完成實(shí)例分配,并且堆也無法再擴(kuò)展時(shí),Java虛擬機(jī)將會拋出OutOfMemoryError異常。

五、方法區(qū)(線程共享)

????????方法區(qū)(Method Area)與Java堆一樣,是各個線程共享的內(nèi)存區(qū)域,它用于存儲已被虛擬機(jī)加載的類型信息、常量、靜態(tài)變量、即時(shí)編譯器編譯后的代碼緩存等數(shù)據(jù)。

????????如果方法區(qū)無法滿足新的內(nèi)存分配需求時(shí),將拋出OutOfMemoryError異常。

六、實(shí)例演示

1、基本數(shù)據(jù)類型

實(shí)體類

@Data
public class UserParam {

    /**
     * 用戶名
     */
    private String userName;
    /**
     * 密碼
     */
    private String password;
    /**
     * 昵稱
     */
    private String nickName;

    /**
     * 舊密碼
     */
    private String oldPassWord;

    /**
     * 新密碼
     */
    private String newPassWord;

}

測試

public class TestStack {
    public static void main(String[] args) {
        UserParam userParam=new UserParam();
        int b=1;
        test(userParam,b);
        test(userParam,b);
        System.out.println(userParam);
    }
    public static void test(UserParam userParam,int a){
        userParam.setUserName(String.valueOf(a));
        a=2;
    }
}

結(jié)果:

【JVM】JVM五大內(nèi)存區(qū)域介紹,jvm

分析:

b變量是基本數(shù)據(jù)類型,創(chuàng)建完在棧幀中,沒有任何引用,參數(shù)也只是傳入值,方法中a改變對b沒有任何影響。

?2、引用數(shù)據(jù)類型會根據(jù)傳入的引用數(shù)據(jù)的改變而改變

public class TestStack {
    public static void main(String[] args) {
        UserParam userParam=new UserParam();
        userParam.setNickName("張三");
        test(userParam);
        test(userParam);
        System.out.println(userParam);
    }
    public static void test(UserParam userParam){
        userParam.setUserName(userParam.getNickName());
        userParam.setNickName("李四");
    }
}

結(jié)果:

【JVM】JVM五大內(nèi)存區(qū)域介紹,jvm

分析:

將對象作為參數(shù)傳入時(shí),test方法中的對象也是指向同一片內(nèi)存區(qū)域,操作的是同一塊內(nèi)存,所以在test方法中改變屬性的值會影響外邊同一個對象內(nèi)的屬性值。文章來源地址http://www.zghlxwxcb.cn/news/detail-616382.html

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

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

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

相關(guān)文章

  • jvm的內(nèi)存劃分區(qū)域

    jvm的內(nèi)存劃分區(qū)域

    java虛擬機(jī)棧、本地方法棧、堆、程序計(jì)數(shù)器、方法區(qū)。 ? ? 1.本地方法棧:用于管理本地方法的調(diào)用,里面并沒有我們寫的代碼邏輯,其由native修飾,由 C 語言實(shí)現(xiàn)。 2.程序計(jì)數(shù)器:它是一塊很小的內(nèi)存空間,主要用來記錄各個線程執(zhí)行的字節(jié)碼的地址,例如,分支、循環(huán)、

    2024年02月11日
    瀏覽(19)
  • jvm的內(nèi)存區(qū)域

    jvm的內(nèi)存區(qū)域

    JVM 內(nèi)存分為線程私有區(qū)和線程共享區(qū),其中方法區(qū)和堆是線程共享區(qū),虛擬機(jī)棧、本地方法棧和程序計(jì)數(shù)器是線程隔離的數(shù)據(jù)區(qū)。 1)程序計(jì)數(shù)器 程序計(jì)數(shù)器(Program Counter Register)也被稱為 PC 寄存器,是一塊較小的內(nèi)存空間。 它可以看作是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號指

    2024年02月10日
    瀏覽(25)
  • JVM內(nèi)存區(qū)域

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

    為了更好的理解類加載和垃圾回收,先要了解一下JVM的內(nèi)存區(qū)域(如果沒有特殊說明,都是針對的是 HotSpot 虛擬機(jī)。)。 Java 源代碼文件經(jīng)過編譯器編譯后生成字節(jié)碼文件,然后交給 JVM 的類加載器,加載完畢后,交給執(zhí)行引擎執(zhí)行。在整個執(zhí)行的過程中,JVM 會用一塊空間來

    2024年02月13日
    瀏覽(20)
  • JVM內(nèi)存區(qū)域劃分

    JVM內(nèi)存區(qū)域劃分

    簡介:JVM有很多個不同版本的實(shí)現(xiàn);其中HotSpot VM是最主流使用的JVM;Oracle官方j(luò)dk和開源openjdk都是使用這個JVM JVM內(nèi)存區(qū)域劃分:按每個區(qū)域不同功能劃分;相互之間不會干擾 本地方法棧 native:表示是JVM內(nèi)部C++代碼;給調(diào)用JVM內(nèi)部方法準(zhǔn)備的??臻g。存儲本地方法native之間調(diào)

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

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

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

    2024年02月13日
    瀏覽(20)
  • JVM內(nèi)存模型/運(yùn)行時(shí)數(shù)據(jù)區(qū)域

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

    java虛擬機(jī)管理這塊內(nèi)存,所以我們也叫運(yùn)行時(shí)數(shù)據(jù)區(qū)域 這里按線程是否共享來分類,所謂線程不共享就是每個線程里面都會配一套 程序計(jì)數(shù)器 棧, 互相不干涉。 而方法區(qū)和堆是線程所有共享 意味著只有一個(這里注意堆是實(shí)際概念 方法區(qū)是一個虛擬概念) 注意:程序計(jì)

    2024年01月18日
    瀏覽(25)
  • JVM哪些區(qū)域會出現(xiàn)內(nèi)存溢出

    JVM(Java Virtual Machine)是指Java虛擬機(jī),是一種可以在不同平臺上運(yùn)行Java字節(jié)碼的虛擬計(jì)算機(jī)。JVM是Java語言的核心,通過將Java代碼編譯成字節(jié)碼并在JVM上運(yùn)行,實(shí)現(xiàn)了跨平臺的特性。 1.方法區(qū)(Metaspace) 方法區(qū)用于存儲類的信息、靜態(tài)變量和常量等數(shù)據(jù)。在JDK8及以上版本中

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

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

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

    2024年02月01日
    瀏覽(57)
  • JVM運(yùn)行時(shí)區(qū)域——對象創(chuàng)建內(nèi)存分配過程

    JVM運(yùn)行時(shí)區(qū)域——對象創(chuàng)建內(nèi)存分配過程

    ????????新創(chuàng)建的對象 , 都存放在伊甸園區(qū)域 ,當(dāng)垃圾回收時(shí),將伊甸園區(qū)域的垃圾數(shù)據(jù)銷毀,然后將存活的對象轉(zhuǎn)移到幸存者0區(qū)域,之后創(chuàng)建的新的對象還是存放在伊甸園區(qū)域,等到再次垃圾回收后,將伊甸園區(qū)域和幸存者0區(qū)域中存活的對象一起轉(zhuǎn)移到幸存者1區(qū)域中

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

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

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

    2024年02月09日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包