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

JVM 內(nèi)存結(jié)構(gòu)快速入門

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

一、簡介

??Java 內(nèi)存模型(Java Memory Model,JMM)是一種規(guī)范,定義了 Java 程序中多線程并發(fā)訪問共享變量時(shí)的行為和規(guī)則。

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

??線程共享:方法區(qū)、堆
??線程獨(dú)有:棧、程序計(jì)數(shù)器

JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

2.1 方法區(qū)

??方法區(qū)是JVM中的一塊內(nèi)存區(qū)域,在JVM啟動(dòng)時(shí)被創(chuàng)建,與堆內(nèi)存分開管理。方法區(qū)的大小可以通過-XX:MetaspaceSize-XX:MaxMetaspaceSize參數(shù)進(jìn)行調(diào)整。

??存儲的內(nèi)容有:

  • 類的結(jié)構(gòu)信息:包括類的字段、方法、父類、接口等
  • 常量池
  • 靜態(tài)變量
  • 即時(shí)編譯器編譯后的代碼
2.3.2 永久代和元空間

??在Java虛擬機(jī)(JVM)的不同版本中,永久代(Permanent Generation)和元空間(Metaspace)是用于存儲類相關(guān)信息的內(nèi)存區(qū)域,都是實(shí)現(xiàn)方法區(qū)的方式。

  1. 永久代(Permanent Generation):
    1.8版本以前有永久代,永久代放在JVM內(nèi)存中,在某些情況下存在一些問題。例如,如果加載的類過多或過大,永久代的大小可能會(huì)不夠,導(dǎo)致OutOfMemoryError。由于這些問題,從JDK 8開始,永久代被元空間所取代。

  2. 元空間(Metaspace):
    元空間是JDK 8及更高版本中取代永久代的新的內(nèi)存區(qū)域。元空間同樣用于存儲類的結(jié)構(gòu)信息、常量池、靜態(tài)變量和即時(shí)編譯器編譯后的代碼等。與永久代不同,元空間的大小不再受限于固定的內(nèi)存大小,而是根據(jù)應(yīng)用程序的需求進(jìn)行動(dòng)態(tài)分配。元空間的數(shù)據(jù)存儲在本地內(nèi)存(Native Memory)中,而不是像永久代那樣存儲在Java運(yùn)行時(shí)內(nèi)存中。這意味著元空間的大小受限于可用的物理內(nèi)存。如果元空間的內(nèi)存耗盡,JVM依然會(huì)拋出OutOfMemoryError。
    JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

2.2 堆

??堆內(nèi)存是Java程序中最大的一塊內(nèi)存區(qū)域,用于存儲對象實(shí)例和數(shù)組。堆內(nèi)存可以劃分為不同的代,包括新生代(Eden區(qū)、Survivor區(qū))和老年代。新創(chuàng)建的對象會(huì)被分配到新生代的Eden區(qū),經(jīng)過垃圾回收后,仍然存活的對象會(huì)被移到Survivor區(qū),最終進(jìn)入老年代。

1.8版本的堆結(jié)構(gòu):
??新生代與老年代的比例是1:2
??Eden、s0、s1的比例是8比1比1
JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

1.9及以后的堆結(jié)構(gòu)
??G1將內(nèi)存劃分成了多個(gè)大小相等的Region(默認(rèn)是512K),Region邏輯上連續(xù),物理內(nèi)存地址不連續(xù)。同時(shí)每個(gè)Region被標(biāo)記成E、S、O、H,分別表示Eden、Survivor、Old、Humongous。其中E、S屬于年輕代,O與H屬于老年代。

??H表示Humongous。從字面上就可以理解表示大的對象(下面簡稱H對象)。當(dāng)分配的對象大于等于Region大小的一半的時(shí)候就會(huì)被認(rèn)為是巨型對象。H對象默認(rèn)分配在老年代,可以防止GC的時(shí)候大對象的內(nèi)存拷貝。
JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

2.1.2 對象的創(chuàng)建和銷毀

??在Java中,對象的創(chuàng)建通過new關(guān)鍵字實(shí)現(xiàn)。當(dāng)調(diào)用new關(guān)鍵字創(chuàng)建對象時(shí),JVM會(huì)在堆內(nèi)存中分配一塊內(nèi)存空間用于存儲對象的實(shí)例變量,并執(zhí)行構(gòu)造方法對對象進(jìn)行初始化。對象的銷毀由垃圾回收器負(fù)責(zé),當(dāng)對象不再被引用時(shí),垃圾回收器會(huì)回收該對象的內(nèi)存空間。

??創(chuàng)建流程:

  1. ?先檢查這個(gè)指令的參數(shù)是否能在常量池中定位到?個(gè)類的符號引?
  2. 檢查這個(gè)符號引?代表的類是否已被加載、解析和初始化過。如果沒有,就先執(zhí)?相應(yīng)的類加載過程
  3. 類加載檢查通過后,接下來虛擬機(jī)將為新?對象分配內(nèi)存。
  4. 內(nèi)存分配完成之后,虛擬機(jī)將分配到的內(nèi)存空間(但不包括對象頭)都初始化為零值。
  5. 接下來設(shè)置對象頭,請求頭?包含了對象是哪個(gè)類的實(shí)例、如何才能找到類的元數(shù)據(jù)信息、對象的 哈希碼、對象的 GC 分代年齡等信息
    JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

2.2 棧內(nèi)存


??棧分為本地方法棧和java方法棧。
JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

??每個(gè)線程在創(chuàng)建時(shí)都會(huì)創(chuàng)建一個(gè)java方法棧,棧內(nèi)會(huì)保存一個(gè)個(gè)的棧幀,每個(gè)棧幀對應(yīng)一個(gè)方法。
??棧采用先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu),方法的調(diào)用和返回都是通過棧幀的入棧和出棧來實(shí)現(xiàn)的。
JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

2.2.1 棧幀的組成和作用

??棧幀是棧內(nèi)存中的一個(gè)元素,用于存儲方法的局部變量表、操作數(shù)棧、動(dòng)態(tài)鏈接、方法返回地址等信息。局部變量表用于存儲方法的局部變量和參數(shù),操作數(shù)棧用于存儲方法執(zhí)行過程中的操作數(shù)和中間結(jié)果。棧幀的作用是提供方法調(diào)用和執(zhí)行的環(huán)境,保證方法的獨(dú)立性和數(shù)據(jù)的隔離性。
JVM 內(nèi)存結(jié)構(gòu)快速入門,JVM,jvm

2.2.2 棧的特點(diǎn)
  1. 棧是線程私有的
  2. 一個(gè)方法開始執(zhí)行棧幀入棧、方法執(zhí)行完對應(yīng)的棧幀就出棧,所以虛擬機(jī)棧不需要進(jìn)行垃圾回收
  3. 虛擬機(jī)棧存在OutOfMemoryError、以及StackOverflowError
  4. 線程太多,就可能會(huì)出現(xiàn)OutOfMemoryError,線程創(chuàng)建時(shí)沒有足夠的內(nèi)存去創(chuàng)建虛擬機(jī)棧了
  5. 方法調(diào)用層次太多,就可能會(huì)出現(xiàn)StackOverflowError(棧的大小有限)
  6. 可以通過-Xss來設(shè)置虛擬機(jī)棧的大小

2.4 程序計(jì)數(shù)器

2.4.1 程序計(jì)數(shù)器的作用和使用場景

??程序計(jì)數(shù)器是一塊較小的內(nèi)存區(qū)域,用于存儲當(dāng)前線程執(zhí)行的字節(jié)碼指令的地址。程序計(jì)數(shù)器在多線程環(huán)境下,每個(gè)線程都有獨(dú)立的程序計(jì)數(shù)器,用于記錄各個(gè)線程執(zhí)行的位置,保證線程切換后能正確恢復(fù)執(zhí)行。文章來源地址http://www.zghlxwxcb.cn/news/detail-650922.html

到了這里,關(guān)于JVM 內(nèi)存結(jié)構(gòu)快速入門的文章就介紹完了。如果您還想了解更多內(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)存結(jié)構(gòu)

    JVM-內(nèi)存結(jié)構(gòu)

    1、定義 程序計(jì)數(shù)器(Program Counter)是JVM中的一塊較小的內(nèi)存區(qū)域,它是一個(gè)指向當(dāng)前線程正在執(zhí)行的字節(jié)碼指令的指針。 程序計(jì)數(shù)器使用的是寄存器 ,特點(diǎn)-快。 程序計(jì)數(shù)器作用是 記住下一條jvm執(zhí)行的執(zhí)行地址。 特點(diǎn): 線程私有的 不會(huì)存在內(nèi)存溢出-jvm規(guī)定了 2、作用 程

    2024年02月15日
    瀏覽(22)
  • JVM 內(nèi)存結(jié)構(gòu)

    JVM 內(nèi)存結(jié)構(gòu)

    Java 虛擬機(jī)的內(nèi)存空間分為 5 個(gè)部分: 程序計(jì)數(shù)器 Java 虛擬機(jī)棧 本地方法棧 堆 方法區(qū) JDK 1.8 同 JDK 1.7 比,最大的差別就是:元數(shù)據(jù)區(qū)取代了永久代。元空間的本質(zhì)和永久代類似,都是對 JVM 規(guī)范中方法區(qū)的實(shí)現(xiàn)。不過元空間與永久代之間最大的區(qū)別在于:元數(shù)據(jù)空間并不在

    2024年02月11日
    瀏覽(17)
  • JVM內(nèi)存結(jié)構(gòu)

    JVM內(nèi)存結(jié)構(gòu)

    類加載:類源代碼經(jīng)編譯器編譯為二進(jìn)制字節(jié)碼,通過 類加載器 加載到JVM JVM內(nèi)存:類存放 方法區(qū) ,實(shí)例對象存放 堆 中,方法調(diào)用時(shí)用到 虛擬機(jī)棧、程序計(jì)數(shù)器、本地方法棧 執(zhí)行引擎: 解釋器 逐行解釋執(zhí)行方法代碼,熱點(diǎn)代碼由 JIT 做編譯、優(yōu)化后的執(zhí)行, GC 負(fù)責(zé)回收堆中不再被引

    2024年01月25日
    瀏覽(20)
  • 【JVM 內(nèi)存結(jié)構(gòu)丨棧】
  • 【JVM】內(nèi)存結(jié)構(gòu)

    【JVM】內(nèi)存結(jié)構(gòu)

    Java 虛擬機(jī)的內(nèi)存空間分為 5 個(gè)部分: 程序計(jì)數(shù)器 Java 虛擬機(jī)棧 本地方法棧 堆 方法區(qū) JDK 1.8 同 JDK 1.7 比,最大的差別就是:元數(shù)據(jù)區(qū)取代了永久代。元空間的本質(zhì)和永久代類似,都是對 JVM 規(guī)范中方法區(qū)的實(shí)現(xiàn)。不過元空間與永久代之間最大的區(qū)別在于:元數(shù)據(jù)空間并不在

    2024年01月23日
    瀏覽(16)
  • 復(fù)習(xí)一下JVM內(nèi)存結(jié)構(gòu)

    程序計(jì)數(shù)器內(nèi)存很小,可以看作是 當(dāng)前線程 所執(zhí)行字節(jié)碼的 行號指示器 。 有了它,程序就能被正確的執(zhí)行。 因?yàn)橛?線程切換 的存在,則每個(gè)線程必須有各自獨(dú)立的程序計(jì)數(shù)器,即 線程私有 的內(nèi)存。 這里再解釋一下什么是 線程切換 ,線程切換指的是: 單處理器在執(zhí)行

    2024年02月20日
    瀏覽(23)
  • JVM內(nèi)存結(jié)構(gòu)介紹

    JVM內(nèi)存結(jié)構(gòu)介紹

    一、java代碼編譯執(zhí)行過程 ? 1.源碼編譯:通過Java源碼編譯器將Java代碼編譯成JVM字節(jié)碼(.class文件) ? 2.類加載:通過ClassLoader及其子類來完成JVM的類加載 ? 3.類執(zhí)行:字節(jié)碼被裝入內(nèi)存,進(jìn)入JVM虛擬機(jī),被解釋器解釋執(zhí)行 ? ? ? ? 注:Java平臺由Java虛擬機(jī)和Java應(yīng)用程序接口

    2024年02月16日
    瀏覽(17)
  • JVM學(xué)習(xí)筆記(二)內(nèi)存結(jié)構(gòu)

    JVM學(xué)習(xí)筆記(二)內(nèi)存結(jié)構(gòu)

    目錄 ? 一、JVM內(nèi)存結(jié)構(gòu) 1. 虛擬機(jī)棧(JVM Stacks) 1)定義 2)棧內(nèi)存溢出 3) 線程運(yùn)行診斷 案例1:CPU占用過高 案例2:程序運(yùn)行很長時(shí)間沒有結(jié)果?編輯 2. 本地方法棧(Native Method Stacks) 3.? 堆(Heap) 1)定義 2)特點(diǎn) 3)堆內(nèi)存溢出 4)堆內(nèi)存診斷 5)案例:垃圾回收后,內(nèi)存

    2024年02月16日
    瀏覽(19)
  • 【JVM 內(nèi)存結(jié)構(gòu) | 程序計(jì)數(shù)器】

    【JVM 內(nèi)存結(jié)構(gòu) | 程序計(jì)數(shù)器】

    主頁傳送門:?? 傳送 Java 虛擬機(jī)的內(nèi)存空間由 堆、棧、方法區(qū)、程序計(jì)數(shù)器和本地方法棧五部分組成。 ??JVM(Java Virtual Machine)內(nèi)存結(jié)構(gòu)包括以下幾個(gè)部分: 堆區(qū)(Heap):堆區(qū)是最大的一塊內(nèi)存區(qū)域,由所有線程共享。所有的對象實(shí)例以及數(shù)組都在這塊內(nèi)存中分配。 方

    2024年02月11日
    瀏覽(18)
  • JVM快速入門篇

    JVM快速入門篇

    請你談?wù)勀銓vm的理解? Java8虛擬機(jī)和之前的變化更新? 什么是OOM?什么是棧溢出StackOverFlowError?怎么分析? jvm的常見調(diào)優(yōu)參數(shù)有哪些? 內(nèi)存快照如何抓?。吭趺捶治鯠ump文件? 談?wù)刯vm中,類加載器你的認(rèn)識? 1.?JVM的位置 2.?JVM的體系結(jié)構(gòu) 3.?類加載器 4.?雙親委派機(jī)制 5

    2024年02月09日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包