Java對象內存結構詳解

Java對象內存結構詳解

Java對象在JVM內存中的存儲結構可以分為三個部分:對象頭(Header)、實例數據(Instance Data)和對齊填充(Padding)。以下是64位JVM(開啟壓縮指針)下的典型布局:
在這里插入圖片描述

1. 對象頭(Header)

對象頭包含運行時元數據和控制信息,占12字節(壓縮指針)或16字節(未壓縮)

(1) Mark Word(8字節)

存儲對象自身的運行時數據,內容會隨鎖狀態變化:

鎖狀態存儲內容
無鎖哈希碼(31bit) + 分代年齡(4bit) + 偏向模式(1bit) + 鎖標志(2bit)
偏向鎖線程ID(54bit) + Epoch(2bit) + 分代年齡(4bit) + 偏向模式(1bit) + 鎖標志(2bit)
輕量級鎖指向棧中鎖記錄的指針(62bit) + 鎖標志(2bit)
重量級鎖指向監視器(Monitor)的指針(62bit) + 鎖標志(2bit)
GC標記空(用于垃圾回收標記)

(2) Klass Pointer(4字節)

指向方法區中的類元數據的指針(開啟壓縮指針時為4字節,否則8字節)

(3) 數組長度(可選,4字節)

如果是數組對象,額外存儲數組長度

2. 實例數據(Instance Data)

存儲對象真正的有效信息,即各個字段的內容,排列順序受以下規則影響:

  1. 基本類型優先(long/double → int/float → short/char → byte/boolean)
  2. 相同寬度字段放在一起
  3. 父類字段在子類之前

字段內存占用

類型大小
boolean1字節
byte1字節
short2字節
char2字節
int4字節
float4字節
long8字節
double8字節
引用類型4字節(壓縮指針)或8字節

示例:

class MyObject {byte b;      // 1字節int i;       // 4字節long l;      // 8字節Object ref;  // 4字節(壓縮指針)
}
// 實例數據總大小 = 1 + 4 + 8 + 4 = 17字節

3. 對齊填充(Padding)

JVM要求對象起始地址必須是8字節的整數倍,因此可能需要填充字節(0-7字節)

示例計算

對象頭:12字節 (MarkWord 8 + KlassPointer 4)
實例數據:17字節
總計:12 + 17 = 29字節
需要填充到32字節(8的倍數)
最終對象大小:32字節

4. 完整對象內存布局示例

[對象頭][Mark Word(8字節)] 0x00000001d83eb950[Klass Pointer(4字節)] 0x0000000100000000[數組長度(4字節)] 0x00000005 (僅數組對象有)
[實例數據][int id(4字節)] 0x00000001[String name(4字節)] 0x000000076bdc8c18[double price(8字節)] 0x4024000000000000
[對齊填充(4字節)] 0x00000000

5. 查看對象內存布局的方法

(1) 使用JOL工具

// 添加依賴
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.16</version>
</dependency>// 打印對象布局
System.out.println(ClassLayout.parseInstance(obj).toPrintable());

(2) 示例輸出

class com.example.MyObject object internals:
OFF  SZ               TYPE DESCRIPTION               VALUE0   8                    (object header: mark)     0x00000001d83eb9508   4                    (object header: class)    0x000000010000000012   4                int MyObject.id               116   8             double MyObject.price            10.024   4   java.lang.String MyObject.name             "test"28   4                    (object alignment gap)    
Instance size: 32 bytes

6. 對象結構優化技巧

  1. 字段重排序:手動排列字段可減少填充

    // 優化前:需要4字節填充
    class Bad {byte b;long l;int i;
    }
    // 優化后:無填充
    class Good {long l;int i;byte b;
    }
    
  2. 使用基本類型:避免包裝類(Integer等)的內存開銷

  3. 對象共享:對于不變對象可復用(如String池)

資料免費獲取

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/75660.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/75660.shtml
英文地址,請注明出處:http://en.pswp.cn/web/75660.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【TI MSPM0】Printf重定向學習

一、新建工程 通過XDS110與電腦進行通信。 選擇這兩個引腳 需要添加這兩個頭文件 在程序中添加這三個函數即可對printf進行重定向 二、封裝函數 另一種方法 封裝一個函數&#xff0c;定義一個數組

深度強化學習基礎 0:通用學習方法

過去自己學習深度強化學習的痛點&#xff1a; 只能看到各種術語、數學公式勉強看懂&#xff0c;沒有建立清晰且準確關聯 多變量交互關系浮于表面&#xff0c;有時候連環境、代理控制的變量都混淆 模型種類繁多&#xff0c;概念繁雜難整合、對比或復用&#xff0c;無框架分析所…

asm匯編源代碼之-字庫轉換程序

將標準的16x16點陣漢字庫(下載16x16漢字庫)轉換成適合VGA文本模式下顯示的點陣漢字庫 本程序需要調用file.asm中的子程序,所以連接時需要把file連接進來,如下 C:\> tlink chghzk file 調用參數描述如下 C:\> chghzk ; 無調用參數,轉換標準庫文件(SRC16.FNT)為適合VGA…

uniapp轉換markdown

效果 AI智能體 微信小程序 流式 1.安裝Node.js 參考:2024最新版Node.js下載安裝及環境配置教程&#xff08;非常詳細&#xff09;_node.js 安裝-CSDN博客 2.需要克隆項目到本地或直接到項目地址下載壓縮包。 參考&#xff1a;uniapp中解析markdown支持網頁和小程序_uniapp ma…

用java代碼如何存取數據庫的blob字段

一.業務 在業務中我們被要求將文件或圖片等轉成 byte[] 或 InputStream存到數據庫的Blob類型的字段中. 二.Blob類型介紹 在 MySQL 中&#xff0c;Blob 數據類型用于存儲二進制數據。MySQL 提供了四種不同的 Blob 類型&#xff1a; TINYBLOB: 最大存儲長度為 255 個字節。BL…

qemu(2) -- 定制開發板

1. 前言 qemu支持自定義開發板&#xff0c;本文就記錄一下折騰的過程。基于qemu-10.0.0-rc3添加x210vb3s開發板。 2. 添加板卡文件 網上參考了一些文章&#xff0c;有些文章使用的版本和我的不一樣&#xff0c;折騰起來費了點時間&#xff0c;最后發現還是直接參考qemu中已有…

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數(決策樹、邏輯回歸、KNN、SVM)

Python在糖尿病分類問題上尋找具有最佳 ROC AUC 分數和 PR AUC 分數&#xff08;決策樹、邏輯回歸、KNN、SVM&#xff09; 問題模板解題思路1. 導入必要的庫2. 加載數據3. 劃分訓練集和測試集4. 數據預處理5. 定義算法及其參數6. 存儲算法和對應指標7. 訓練模型并計算指標8. 找…

CPU(中央處理器)

一、CPU的定義與核心作用 CPU 是計算機的核心部件&#xff0c;負責 解釋并執行指令、協調各硬件資源 以及 完成數據處理&#xff0c;其性能直接影響計算機的整體效率。 核心功能&#xff1a; 從內存中讀取指令并譯碼。執行算術邏輯運算。控制數據在寄存器、內存和I/O設備間的…

上層 Makefile 控制下層 Makefile 的方法

在復雜的項目中&#xff0c;通常會將項目劃分為多個模塊或子項目&#xff0c;每個模塊都有自己的 Makefile。上層 Makefile 的作用是協調和控制這些下層 Makefile 的構建過程。下面是幾種常見的示例&#xff0c;實現上層 Makefile 對下層 Makefile 的控制。 直接調用&#xff1…

prompts提示詞經典模板

prompts.py 中的提示詞模板詳解 文件中定義了兩個核心提示詞模板&#xff1a;REASON_PROMPT 和 RELEVANT_EXTRACTION_PROMPT。這兩個模板在 DeepResearcher 的推理過程中扮演著關鍵角色。下面我將詳細解析這兩個模板的結構和功能。 REASON_PROMPT 詳解 REASON_PROMPT 是用于指…

使用python獲取電腦硬盤信息

import psutil# 獲取硬盤信息 disk_partitions psutil.disk_partitions() print(disk_partitions) for partition in disk_partitions:print(f"設備: {partition.device}")print(f"掛載點: {partition.mountpoint}")print(f"文件系統類型: {partitio…

HarmonyOS-ArkUI V2裝飾器: @Provider和@Consumer裝飾器:跨組件層級雙向同步

作用 我們在之前學習的那些控件中,各有特點,也各有缺陷,至今沒有痛痛快快的出現過真正能跨組件的雙向綁定的裝飾器。 比如 @Local裝飾器,不能跨組件@Param裝飾器呢,能跨組件傳遞,但是僅僅就是下一層組件接收參數。另外,它是單向傳遞,不可被重新賦值。如果您非要改值則…

索引下推(Index Condition Pushdown, ICP)

概念 索引下推是一種數據庫查詢優化技術&#xff0c;通過在存儲引擎層面應用部分WHERE條件來減少不必要的數據讀取。它特別適用于復合索引的情況&#xff0c;因為它可以在索引掃描階段就排除不符合全部條件的數據行&#xff0c;而不是將所有可能匹配的記錄加載到服務器層再進行…

idea在線離線安裝插件教程

概述 對于小白來說&#xff0c;剛使用idea時&#xff0c;還有很多不懂的地方&#xff0c;這里&#xff0c;簡單介紹下如何安裝插件。讓小白能容易上手全盤idea。 1、File -> Settings 2、找到 Plugins -> Marketplace 3、安裝 3.1、在線安裝 輸入想搜索的內容&#x…

豪越賦能消防安全管控,解鎖一體化內管“安全密碼”

在消防安全保障體系中&#xff0c;內部管理的高效運作是迅速、有效應對火災及各類災害事故的重要基礎。豪越科技憑借在消防領域的深耕細作與持續創新&#xff0c;深入剖析消防體系內部管理的痛點&#xff0c;以自主研發的消防一體化安全管控平臺&#xff0c;為行業發展提供了創…

ES6學習03-字符串擴展(unicode、for...of、字符串模板)和新方法()

一、字符串擴展 1. eg: 2.for...of eg: 3. eg: 二。字符串新增方法 1. 2. 3. 4. 5.

探索Streamlit在測試領域的高效應用:文檔讀取與大模型用例生成的完美前奏

大模型用例生成前置工作之文檔讀取——構建你的自動化測試基礎 在群友的極力推薦下&#xff0c;開始了streamlit的學習之旅。本文將介紹如何使用Streamlit開發一個多功能文檔處理工具&#xff0c;支持讀取、預覽、格式轉換和導出多種測試相關文檔&#xff08;YAML、JSON、DOCX…

flutter 桌面應用之窗口自定義

在開發桌面軟件的時候我們經常需要配置軟件的窗口的大小以及位置 我們有兩個框架選擇:window_manager和bitsdojo_window 對比bitsdojo_window 特性bitsdojo_windowwindow_manager自定義標題欄? 支持? 不支持控制窗口行為&#xff08;大小/位置&#xff09;?&#xff08;基本…

Cyber Weekly #51

賽博新聞 1、英偉達開源新模型&#xff0c;性能直逼DeepSeek-R1 本周&#xff0c;英偉達開源了基于Meta早期Llama-3.1-405B-Instruct模型開發的Llama-3.1-Nemotron-Ultra-253B-v1大語言模型&#xff0c;該模型擁有2530億參數&#xff0c;在多項基準測試中展現出與6710億參數的…

【JS】關于原型/原型鏈

本文會講解什么是原型&#xff0c;什么是原型鏈&#xff0c;以及查找原型的方法&#xff0c;最后會實現一個函數&#xff1a;判斷某對象是否有某屬性。 定義 原型&#xff1a;函數都有prototype屬性&#xff0c;稱作原型/原型對象 原型可以放一些方法和屬性&#xff0c;共享…