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

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

這篇具有很好參考價值的文章主要介紹了JVM—對象的創(chuàng)建流程與內(nèi)存分配。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

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

創(chuàng)建流程

對象創(chuàng)建的流程圖如下:

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

對象的內(nèi)存分配方式

內(nèi)存分配的方式有兩種:

  • 指針碰撞(Bump the Pointer)
  • 空閑列表(Free List)
分配方式 說明 收集器
指針碰撞(Bump the Pointer) 內(nèi)存地址是連續(xù)的(新生代) Serial和ParNew收集器
空閑列表(Free List) 內(nèi)存地址不連續(xù)(老年代) CMS收集器和Mark-Sweep收集器

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

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

指針碰撞

指針碰撞示意圖如下:

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

內(nèi)存分配安全問題:

虛擬機給A線程分配內(nèi)存的過程中,指針未修改,此時B線程同時使用了該內(nèi)存,就會出現(xiàn)問題。

解決方式:

  • CAS樂觀鎖:JVM虛擬機采用CAS失敗重試的方式保證更新操作的原子性;
  • TLAB (Thread Local Allocation Buffer)本地線程分配緩存,預(yù)分配。
分配主流程

首先從TLAB里面分配,如果分配不到,再使用CAS從堆里面劃分。

對象如何進入老年代

對象進入老年代流程如下:

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

  • 新對象大多數(shù)默認都進入Eden;

  • 對象進入老年代的四種情況:

    • 年齡太大 MinorGC15次-XX:MaxTenuringThreshold】;

    • 動態(tài)年齡判斷:MinorGC后會動態(tài)判斷年齡,將符合要求對象移入老年代;

      MinorGC之后,發(fā)現(xiàn)Survivor區(qū)中的一批對象的總大小大于了這塊Survivor區(qū)的50%,那么就會將此時大于等于這批對象年齡最大值的所有對象,直接進入老年代。

      例子: Survivor區(qū)中有一批對象,年齡分別為年齡1+年齡2+年齡n的多個對象,對象總和大小超過了Survivor區(qū)域的50%,此時就會把年齡n及以上的對象都放入老年代。希望那些可能是長期存活的對象,盡早進入老年代。
      比率可以由-XX:TargetsurvivorRatio指定
      
    • 大對象直接進入老年代1M【-XX:PretenureSizeThreshold 】;(前提是Serial和ParNew收集器)

      為了避免大對象分配內(nèi)存時的復(fù)制操作降低效率。

      避免了Eden和Survivor區(qū)的復(fù)制。

    • MinorGC后存活對象太多無法放入Survivor。

空間擔保機制

空間擔保機制:當新生代無法分配內(nèi)存的時候,我們想把新生代的老對象轉(zhuǎn)移到老年代,然后把新對象放入騰空的新生代。此種機制我們稱之為內(nèi)存擔保。

空間擔保流程圖如下:

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

對象內(nèi)存布局

對象內(nèi)存布局示意圖如下:

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

對象里的三個區(qū)

堆內(nèi)存中,一個對象在內(nèi)存中存儲的布局可以分為三塊區(qū)域:

堆內(nèi)存中,一個對象在內(nèi)存中存儲的布局可以分為三塊區(qū)域:

  • 對象頭(Header) : Java對象頭占8byte。如果是數(shù)組則占12byte。因為JVM里數(shù)組size需要使用4byte存儲。

    • 標記字段MarkWord:

      • 用于存儲對象自身的運行時數(shù)據(jù),它是synchronized實現(xiàn)輕量級鎖和偏向鎖的關(guān)鍵。

      • 默認存儲:對象HashCode、GC分代年齡、鎖狀態(tài)等等信息。

      • 為了節(jié)省空間,也會隨著鎖標志位的變化,存儲數(shù)據(jù)發(fā)生變化。

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

    • 類型指針KlassPoint:

      • 是對象指向它的類元數(shù)據(jù)的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例
      • 開啟指針壓縮存儲空間4byte,不開啟8byte。
      • JDK1.6+默認開啟
    • 數(shù)組長度:如果對象是數(shù)組,則記錄數(shù)組長度,占4個byte,如果對象不是數(shù)組則不存在。

    • 對齊填充:保證數(shù)組的大小永遠是8byte的整數(shù)倍。

  • 實例數(shù)據(jù)(Instance Data):生成對象的時候,對象的非靜態(tài)成員變量也會存入堆空間

  • 對齊填充(Padding) :JVM內(nèi)對象都采用8byte對齊,不夠8byte的會自動補齊。

如何訪問一個對象

有兩種方式:

  1. 句柄:穩(wěn)定,對象被移動只要修改句柄中的地址

  2. 直接指針:訪問速度快,節(jié)省了一次指針定位的開銷

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

JVM—對象的創(chuàng)建流程與內(nèi)存分配,JVM,jvm文章來源地址http://www.zghlxwxcb.cn/news/detail-846760.html

到了這里,關(guān)于JVM—對象的創(chuàng)建流程與內(nèi)存分配的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 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日
    瀏覽(21)
  • JVM 創(chuàng)建對象時分配內(nèi)存的幾種方法、分配方法的選擇

    ????????假設(shè)Java堆中內(nèi)存是絕對規(guī)整的,所有被使用過的內(nèi)存都被放在一邊,空閑的內(nèi)存被放在另一邊,中間放著一個指針作為分界點的指示器,那所分配內(nèi)存就僅僅是把那 個指針向空閑空間方向挪動一段與對象大小相等的距離。 ????????如果Java堆中的內(nèi)存并不是規(guī)

    2024年02月10日
    瀏覽(17)
  • Java進階(1)——JVM的內(nèi)存分配 & 反射Class類的類對象 & 創(chuàng)建對象的幾種方式 & 類加載(何時進入內(nèi)存JVM)& 注解 & 反射+注解的案例

    Java進階(1)——JVM的內(nèi)存分配 & 反射Class類的類對象 & 創(chuàng)建對象的幾種方式 & 類加載(何時進入內(nèi)存JVM)& 注解 & 反射+注解的案例

    1.java運行時的內(nèi)存分配,創(chuàng)建對象時內(nèi)存分配; 2.類加載的順序,創(chuàng)建一個唯一的類的類對象; 3.創(chuàng)建對象的方式,new,Class.forName,clone; 4.什么時候加載.class文件進入JVM內(nèi)存中,看到new,Class.forName; 5.如何加載?雙親委托(委派)機制:安全;AppClassLoader; 6.反射實質(zhì):能

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

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

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

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

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

    2024年02月16日
    瀏覽(22)
  • JVM 垃圾回收詳解之內(nèi)存分配和回收原則+死亡對象判斷方法

    JVM 垃圾回收詳解之內(nèi)存分配和回收原則+死亡對象判斷方法

    當需要排查各種內(nèi)存溢出問題、當垃圾收集成為系統(tǒng)達到更高并發(fā)的瓶頸時,我們就需要對這些“自動化”的技術(shù)實施必要的監(jiān)控和調(diào)節(jié)。 Java 的自動內(nèi)存管理主要是針對對象內(nèi)存的回收和對象內(nèi)存的分配。同時,Java 自動內(nèi)存管理最核心的功能是 堆 內(nèi)存中對象的分配與回收

    2023年04月19日
    瀏覽(40)
  • 說一下JVM創(chuàng)建對象的流程?

    說一下JVM創(chuàng)建對象的流程?

    在實例化一個對象的時候,JVM 首先會去檢查目標對象是否已經(jīng)被加載并初始化了。如果沒有,JVM 需要立刻去加載目標類,然后調(diào)用目標類的構(gòu)造器完成初始化。然后初始化的過程,主要是對目標類里面的靜態(tài)變量、成員變量、靜態(tài)代碼塊進行初始化 當目標類被初始化以后,

    2024年02月22日
    瀏覽(17)
  • 【JVM】詳細解析java創(chuàng)建對象的具體流程

    【JVM】詳細解析java創(chuàng)建對象的具體流程

    目錄 一、java創(chuàng)建對象的幾種方式 1.1、使用new ?1.2、反射創(chuàng)建對象 1.2.1、Class.newInstance創(chuàng)建對象 1.2.2、調(diào)用構(gòu)造器再去創(chuàng)建對象Constructor.newInstance ?1.3、clone實現(xiàn) 1.4、反序列化 二、創(chuàng)建對象的過程 2.1、分配空間的方式 1、指針碰撞 2、空閑列表 3、怎么選擇分配方式 三、

    2024年02月15日
    瀏覽(15)
  • 深入理解JVM:Java使用new創(chuàng)建對象的流程

    ????????①new 對象 ????????②反射 ????????③對象的復(fù)制 ????????④反序列化 先看看常量池里面有沒有,如果有,就用常量池的 看這個類有沒有被加載過,如果沒有,就執(zhí)行類加載以及類的初始化。(對象的大小,在類加載的時候就確定了)。 對象在堆內(nèi)存

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

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

    2024年02月10日
    瀏覽(26)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包