日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

JVM——对象的创建与内存布局

發(fā)布時(shí)間:2025/3/12 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM——对象的创建与内存布局 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

導(dǎo)航

  • 一、對(duì)象的創(chuàng)建過程
  • 二、對(duì)象的內(nèi)存布局
    • 2.1 內(nèi)存布局
    • 2.2 計(jì)算對(duì)象的內(nèi)存大小
  • 三、對(duì)象的定位
    • 3.1 句柄池
    • 3.2 直接指針
  • 四、對(duì)象的分配過程

一、對(duì)象的創(chuàng)建過程

對(duì)象,又叫實(shí)例,是 OOP 的最常用角色。

如何創(chuàng)建一個(gè)對(duì)象?一般都是使用 new 關(guān)鍵字搭配對(duì)象的構(gòu)造函數(shù):

// 基類的創(chuàng)建 Object obj = new Object(); // 普通用戶對(duì)象的創(chuàng)建 User user = new User("Tom", 29); // 服務(wù)類對(duì)象的創(chuàng)建 Service svic = new ServiceImpl(user);

上述代碼創(chuàng)建了三個(gè)對(duì)象:obj、user、svic。

這個(gè)過程大致可以分為以下幾個(gè)步驟:

  • 如果該對(duì)象的類還未使用過,需要加載類的信息,并完成連接、初始化等操作。參考《JVM——詳解類加載過程》
  • 申請(qǐng)對(duì)象,內(nèi)存成員變量賦 default value,此步驟和類加載過程的 preparation 同理。
  • 調(diào)用構(gòu)造方法<init> : 成員變量順序賦初始值,執(zhí)行構(gòu)造方法語句
  • 最后將實(shí)例數(shù)據(jù)的指針返回,存儲(chǔ)在位于棧中的引用數(shù)據(jù)中,即引用賦值。
  • 二、對(duì)象的內(nèi)存布局

    2.1 內(nèi)存布局

    在JVM 中,對(duì)象的內(nèi)存布局分為:

  • 對(duì)象頭(Header),Mark Word + Class Pointer。
  • 實(shí)例數(shù)據(jù)(Instance Data),包含父類所有字段信息。
  • 對(duì)齊填充(Padding),任何對(duì)象大小都必須是 8 字節(jié)的整數(shù)倍。
  • 對(duì)象頭包含兩類數(shù)據(jù):

  • Mark Word :它是對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù),在 Hotspot 虛擬機(jī)中,該數(shù)據(jù)長(zhǎng)度是 8 字節(jié)(64位操作系統(tǒng))。包括哈希碼、GC分代年齡、鎖狀態(tài)標(biāo)志、偏向線程ID、偏向時(shí)間戳等。
  • Class Pointer :類型指針,–XX:+UseCompressedClassPointers 壓縮類型指針,開啟時(shí)該數(shù)據(jù)為 4字節(jié),不開啟為 8 字節(jié)。
  • 2.2 計(jì)算對(duì)象的內(nèi)存大小

    Java 語言并不具備類似 C 語言中的 sizeOf 函數(shù),可以直接獲取對(duì)象的大小。但是,Java 提供了一個(gè) agent 機(jī)制,可以通過這個(gè)機(jī)制來計(jì)算 Java 對(duì)象的內(nèi)存大小。

    Agent 機(jī)制簡(jiǎn)單的理解就是,一個(gè) class 要加載到內(nèi)存,JVM 可以提供一個(gè) Agent 代理來截獲這些 class 文件,以此來讀出整個(gè)Object 大小。

    三、對(duì)象的定位

    對(duì)象的定位指的是,引用是如何找到具體的實(shí)例數(shù)據(jù)地址的?

    目前有兩種實(shí)現(xiàn)方式:句柄池、直接指針。

    兩種方式各有優(yōu)劣,句柄池的方式更安全,而直接指針更快。

    3.1 句柄池

    3.2 直接指針

    四、對(duì)象的分配過程

    首先,new 一個(gè)對(duì)象的時(shí)候,先往棧上分配,如果能分配的下,就直接分配在棧上,然后棧一彈出對(duì)象就沒了。如果棧上分配不下,特別大的話,直接分配到堆內(nèi)存老年代。如果不大,首先會(huì)進(jìn)行線程本地分配,如果能分配的下,就直接分配,如果分配不下,找 eden 區(qū)。

    總結(jié)

    以上是生活随笔為你收集整理的JVM——对象的创建与内存布局的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。