日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/12 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM——对象的创建与内存布局 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

導航

  • 一、對象的創建過程
  • 二、對象的內存布局
    • 2.1 內存布局
    • 2.2 計算對象的內存大小
  • 三、對象的定位
    • 3.1 句柄池
    • 3.2 直接指針
  • 四、對象的分配過程

一、對象的創建過程

對象,又叫實例,是 OOP 的最常用角色。

如何創建一個對象?一般都是使用 new 關鍵字搭配對象的構造函數:

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

上述代碼創建了三個對象:obj、user、svic。

這個過程大致可以分為以下幾個步驟:

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

    2.1 內存布局

    在JVM 中,對象的內存布局分為:

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

  • Mark Word :它是對象自身的運行時數據,在 Hotspot 虛擬機中,該數據長度是 8 字節(64位操作系統)。包括哈希碼、GC分代年齡、鎖狀態標志、偏向線程ID、偏向時間戳等。
  • Class Pointer :類型指針,–XX:+UseCompressedClassPointers 壓縮類型指針,開啟時該數據為 4字節,不開啟為 8 字節。
  • 2.2 計算對象的內存大小

    Java 語言并不具備類似 C 語言中的 sizeOf 函數,可以直接獲取對象的大小。但是,Java 提供了一個 agent 機制,可以通過這個機制來計算 Java 對象的內存大小。

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

    三、對象的定位

    對象的定位指的是,引用是如何找到具體的實例數據地址的?

    目前有兩種實現方式:句柄池、直接指針。

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

    3.1 句柄池

    3.2 直接指針

    四、對象的分配過程

    首先,new 一個對象的時候,先往棧上分配,如果能分配的下,就直接分配在棧上,然后棧一彈出對象就沒了。如果棧上分配不下,特別大的話,直接分配到堆內存老年代。如果不大,首先會進行線程本地分配,如果能分配的下,就直接分配,如果分配不下,找 eden 區。

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。