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

JVM的內(nèi)存分配及各種常量池的區(qū)別(靜態(tài)常量池、運(yùn)行時常量池、字符串常量池)

這篇具有很好參考價值的文章主要介紹了JVM的內(nèi)存分配及各種常量池的區(qū)別(靜態(tài)常量池、運(yùn)行時常量池、字符串常量池)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

JVM內(nèi)存分配

先了解下JVM中的內(nèi)存分配,此處以hotspot vm為例(官方j(luò)dk采用的vm)

程序計數(shù)器

1. 虛擬機(jī)棧

2. 本地方法棧

Java堆

堆內(nèi)存是各個線程共享的區(qū)域

方法區(qū)

它用于存儲已經(jīng)被虛擬機(jī)加載的類信息、常量、靜態(tài)變量、即編譯器編譯后的代碼等數(shù)據(jù)。靜態(tài)變量、常量在方法區(qū),所有方法,包括靜態(tài)和非靜態(tài)的,也在方法區(qū)

這里解釋一下方法區(qū):

  • 首先方法區(qū)不是在堆中,在java8之前是用永久代實(shí)現(xiàn)的,永久代Hotspot 虛擬機(jī)特有的概念,雖然 Java 虛擬機(jī)規(guī)范把方法區(qū)描述為堆的一個邏輯部分,但是它卻有一個別名叫做 Non-Heap(非堆),目的應(yīng)該是與 Java 堆區(qū)分開來

  • java8之后是用元空間實(shí)現(xiàn)的,元空間并不在虛擬機(jī)中,而是使用本地內(nèi)存。

只是 JVM 規(guī)范中定義的一個概念,用于存儲被 JVM 加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)

?文章來源地址http://www.zghlxwxcb.cn/news/detail-413135.html

常量池

常量池分為靜態(tài)常量池運(yùn)行時常量池

1. 靜態(tài)常量池

也叫 class文件常量池,主要存放編譯期生成的各種字面量(Literal)和符號引用(Symbolic References)。

final類型的常量在編譯期間就會進(jìn)行分配。

靜態(tài)常量池指的是在編譯期確定,保存在class文件中的一些數(shù)據(jù)。

靜態(tài)常量池是在編譯期間生成的,存儲在.class文件中。

?

字面量(Literal)和符號引用量,字面量相當(dāng)于Java語言層面常量的概念,如文本字符串、聲明為final的常量值等,符號引用則屬于編譯原理方面的概念,包括了如下三種類型的常量:

  • 1、類和接口的全限定名;

  • 2、字段的名稱和描述符;

  • 3、方法的名稱和描述符。

2. 運(yùn)行時常量池

  • 當(dāng)類加載到內(nèi)存中后,JVM就會將class常量池中的內(nèi)容存放到運(yùn)行時常量池中;運(yùn)行時常量池里面存儲的主要是編譯期間生成的字面量、符號引用等等。

  • 類加載在鏈接環(huán)節(jié)的解析過程,會符號引用轉(zhuǎn)換成直接引用(靜態(tài)鏈接)。此處得到的直接引用也是放到運(yùn)行時常量池中的。

  • 運(yùn)行期間可以動態(tài)放入新的常量

運(yùn)行時常量池內(nèi)存位置:java8之前都在方法區(qū)中,java8之后在元空間

2.1 字符串常量池

字符串常量池,也可以理解成運(yùn)行時常量池分出來的一部分。類加載到內(nèi)存的時候,字符串會存到字符串常量池里面。利用池的概念,避免大量頻繁創(chuàng)建字符串

  • JDK6時字符串常量池位于運(yùn)行時常量池,JDK7挪到堆中。

Hotspot8之前,使用持久代實(shí)現(xiàn)方法區(qū),由于持久代內(nèi)存不好估算,很容易到值OOM:Perm Gen異常。而元空間是本地內(nèi)存,取決于操作系統(tǒng)分配內(nèi)存。

字符串常量池位置變遷

Jdk1.6及之前: 有永久代, 運(yùn)行時常量池在永久代,運(yùn)行時常量池包含字符串常量池

Jdk1.7:有永久代,但已經(jīng)逐步“去永久代”,字符串常量池從永久代里的運(yùn)行時常量池分離到堆里

Jdk1.8及之后: 無永久代,運(yùn)行時常量池在元空間,字符串常量池里依然在堆里

?

?

參考文章

(62條消息) 深入理解java虛擬機(jī)(全章節(jié)完整)_TJtulong的博客-CSDN博客

(62條消息) Java | JVM | 詳細(xì)圖解,堅(jiān)持看完,帶你真正搞懂Java虛擬機(jī)_唐 城的博客-CSDN博客

(62條消息) Java-雙親委派機(jī)制_七樓、的博客-CSDN博客

(62條消息) Java-類加載器11127222七樓、的博客-CSDN博客

(62條消息) jvm中的常量池到底在哪里?常量池在哪里yuan_qh的博客-CSDN博客

(62條消息) Java方法區(qū)和永久代java永久代和方法區(qū)yuan_qh的博客-CSDN博客

這一次,徹底弄懂java中的常量池 - 掘金 (juejin.cn)

(62條消息) JAVA常量池,一篇文章就足夠入門了。(含圖解)lei'chang'liang'chi河海哥yyds的博客-CSDN博客

(62條消息) Java 常量池詳解(一)字符串常量池_new hilbert()的博客-CSDN博客

徹底搞清楚class常量池、運(yùn)行時常量池、字符串常量池 - Awecoder - 博客園 (cnblogs.com)

?

?

到了這里,關(guān)于JVM的內(nèi)存分配及各種常量池的區(qū)別(靜態(tài)常量池、運(yùn)行時常量池、字符串常量池)的文章就介紹完了。如果您還想了解更多內(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)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

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

相關(guān)文章

  • 【C/C++】靜態(tài)內(nèi)存分配與動態(tài)內(nèi)存分配

    1.1 - 定義概述 內(nèi)存分配 (Memory Allocation) 是指為計算機(jī)程序或服務(wù)分配物理內(nèi)存空間或虛擬內(nèi)存空間的一個過程。通常在程序執(zhí)行前或執(zhí)行時完成內(nèi)存分配。 1.2 - 分類概述 存在兩種類型的內(nèi)存分配: 編譯時內(nèi)存分配或靜態(tài)內(nèi)存分配 (Compile-time or Static Memory Allocation) 運(yùn)行時內(nèi)存

    2024年02月11日
    瀏覽(23)
  • Jvm創(chuàng)建對象之內(nèi)存分配-JVM(七)

    Jvm創(chuàng)建對象之內(nèi)存分配-JVM(七)

    上篇文章介紹了jvm創(chuàng)建,會校驗(yàn)是否已加載類,沒有則加載,通過之前學(xué)的源碼,classLoader加載完之后,虛擬機(jī)開始給類分配內(nèi)存,指針移動分配和free鏈表分配,解決并發(fā)分配情況用cap和TLAB方法。之后設(shè)置對象頭部信息,有mark word線程鎖,分代年齡等,klass pointer。還有指針

    2024年02月13日
    瀏覽(25)
  • JVM的故事—— 內(nèi)存分配策略

    堆內(nèi)存有新生代和老年代,新生代中有一個Eden區(qū)和一個Survivor區(qū)(from space或者to space)。當(dāng)有新的對象分配時,會優(yōu)先分配在Eden區(qū)。當(dāng)Eden區(qū)空間不足分配給新對象時,會進(jìn)行一次minor GC,回收完沒有引用的對象后,先考慮把一些Eden區(qū)的對象放到Survivor區(qū),如果放不下,就放到老

    2024年02月10日
    瀏覽(26)
  • JVM 給對象分配內(nèi)存空間

    指針碰撞 空閑列表 TLAB 為對象分配空間的任務(wù)實(shí)際上便等同于把一塊確定大小的內(nèi)存塊從Java堆中劃分出來。 指針碰撞:(Bump The Pointer) 堆的內(nèi)存是絕對規(guī)整的,內(nèi)存主要分為兩部分,所有使用過的內(nèi)存被放在一邊,空閑的內(nèi)存被放在另一邊,中間放著一個指針作為分界點(diǎn)

    2024年02月11日
    瀏覽(20)
  • jvm對象創(chuàng)建和內(nèi)存分配優(yōu)化

    jvm對象創(chuàng)建和內(nèi)存分配優(yōu)化

    1、類加載檢測 虛擬機(jī)遇到一條new指令時,首先將去檢查這個指令的參數(shù)是否能在常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否是否已被加載、解析和初始化過。如果沒有,那必須先執(zhí)行相應(yīng)的類加載過程。 new指令對應(yīng)語言層面講是,new、對

    2024年02月13日
    瀏覽(33)
  • JVM面試題-JVM對象的創(chuàng)建過程、內(nèi)存分配、內(nèi)存布局、訪問定位等問題詳解

    JVM面試題-JVM對象的創(chuàng)建過程、內(nèi)存分配、內(nèi)存布局、訪問定位等問題詳解

    內(nèi)存分配的兩種方式 指針碰撞 適用場合:堆內(nèi)存 規(guī)整 (即沒有內(nèi)存碎片)的情況下。 原理:用過的內(nèi)存全部整合到一邊,沒有用過的內(nèi)存放在另一邊,中間有一個分界指針,只需要向著沒用過的內(nèi)存方向?qū)⒃撝羔樢苿訉ο髢?nèi)存大小位置即可。 使用該分配方式的GC收集器:

    2024年02月08日
    瀏覽(19)
  • JVM—對象的創(chuàng)建流程與內(nèi)存分配

    JVM—對象的創(chuàng)建流程與內(nèi)存分配

    對象創(chuàng)建的流程圖如下: 內(nèi)存分配的方式有兩種: 指針碰撞(Bump the Pointer) 空閑列表(Free List) 分配方式 說明 收集器 指針碰撞(Bump the Pointer) 內(nèi)存地址是連續(xù)的(新生代) Serial和ParNew收集器 空閑列表(Free List) 內(nèi)存地址不連續(xù)(老年代) CMS收集器和Mark-Sweep收集器

    2024年04月10日
    瀏覽(30)
  • JVM運(yùn)行時數(shù)據(jù)區(qū)——字符串常量池位置的調(diào)整

    JVM運(yùn)行時數(shù)據(jù)區(qū)——字符串常量池位置的調(diào)整

    ????????在JDK6及之前,使用永久代來實(shí)現(xiàn)方法區(qū),字符串常量池(StringTable)是在 永久代(方法區(qū))中 的,但是方法區(qū)的回收效率不高,在Full GC時才會回收。 ? ????????在JDK7中,將字符串常量池 轉(zhuǎn)移到了堆中 ,分配在年輕代和老年代中。 ????????在JDK8中,為了 融合

    2024年02月16日
    瀏覽(49)
  • JVM對象創(chuàng)建與內(nèi)存分配機(jī)制深度剖析

    JVM對象創(chuàng)建與內(nèi)存分配機(jī)制深度剖析

    (1)類加載檢查 虛擬機(jī)遇到一條new指令時,首先將去檢查這個指令的參數(shù)是否能在常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已被加載、解析和初始化過。如果沒有,那必須先執(zhí)行相應(yīng)的類加載過程; 所以所類加載是 懶加載 ; new指令對應(yīng)到語

    2024年02月13日
    瀏覽(26)
  • JVM對象在堆內(nèi)存中是否如何分配?

    JVM對象在堆內(nèi)存中是否如何分配?

    1:指針碰撞:內(nèi)存規(guī)整的情況下 2:空閑列表: 內(nèi)存不規(guī)整的情況下 選擇那種分配方式 是有 java堆是否規(guī)整而決定的。而java堆是否規(guī)整是否對應(yīng)的垃圾回收器是否帶有空間壓縮整理的能力決定的。 因此當(dāng)使用Serial,ParNew等帶有壓縮整理過程的收集器時,系統(tǒng)采用的分配算法是

    2024年02月16日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包