jvm對象內存占用

歡迎訪問我的主頁: https://heeheeaii.github.io/

在Java虛擬機(JVM)中,一個對象在內存中的存儲布局可以分為三個部分:對象頭(Object Header)、實例數據(Instance Data)和對齊填充(Padding)。理解這三個部分對于分析內存占用和性能優化非常重要。

  1. 對象頭(Object Header)
    每個Java對象都必須有一個對象頭,這部分就像是對象的“身份證”,它存儲著與對象運行時相關的重要元數據。對象頭主要包含兩個部分:

Mark Word(標記字段):這部分是對象頭的核心,用于存儲對象的運行時信息,比如哈希碼、GC分代年齡、鎖狀態標志、偏向鎖ID等。這部分的大小在32位和64位JVM中是不同的,通常在64位JVM中占用8字節。

Klass Pointer(類指針):這是一個指針,指向該對象對應的類元數據(在方法區中)。通過這個指針,JVM可以確定這個對象是哪個類的實例。在64位JVM上,這個指針通常是8字節。

為了節省內存,現代64位JVM通常會開啟**壓縮指針(Compressed Oops)**技術。當開啟此技術后,原本8字節的類指針會被壓縮成4字節,這大大減少了每個對象占用的內存空間。

因此,在64位JVM上:

開啟壓縮指針(默認):對象頭大小為 12字節(8字節Mark Word + 4字節Klass Pointer)。

關閉壓縮指針:對象頭大小為 16字節(8字節Mark Word + 8字節Klass Pointer)。

  1. 實例數據(Instance Data)
    這部分是真正存儲對象中所有實例字段(即成員變量)的地方,包括從父類繼承的字段。JVM會按照一定的順序來存放這些字段,通常的順序是:

父類中定義的變量。

當前類中定義的變量。

在字段的存儲順序上,JVM為了更高效地讀取,會對字段進行重新排序。一般來說,它會把占用空間小的字段(如byte、boolean、char、short)排列在占用空間大的字段(如long、double、Object引用)之后,以減少對齊填充帶來的內存浪費。

  1. 對齊填充(Padding)
    由于JVM要求對象的總大小必須是8字節的倍數,以便于CPU高效地進行內存存取,所以當對象頭和實例數據加起來的總大小不是8的倍數時,JVM會在最后添加一些字節,這就是對齊填充。

這個過程可以理解為:總大小 = 對齊填充前的總大小 + 填充字節,最終的結果是8的倍數。

舉例說明
假設我們在64位JVM上,開啟了壓縮指針(默認設置),有一個Student類:

Java

class Student {
String name; // 引用類型
int age; // 基本類型
boolean isMale; // 基本類型
}
對象頭:12字節(開啟壓縮指針)。

實例數據:

name(引用類型):4字節(壓縮指針)。

age(int):4字節。

isMale(boolean):1字節。

實例數據總大小:4 + 4 + 1 = 9字節。

對齊填充:

當前總大小:12(對象頭) + 9(實例數據) = 21字節。

21不是8的倍數,下一個8的倍數是24。

所以需要填充 24 - 21 = 3字節。

最終,這個Student對象的總大小就是 24字節。

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

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

相關文章

嵌入式系統中mcu寄存器分類劃分

目錄一、 按行為特性分類二、 按功能角色分類(更宏觀的角度)總結與注意事項在32位單片機(尤其是基于ARM Cortex-M系列內核的)中,寄存器的種類可以按照其“行為模式”和“功能”來進行分類。以下是32位單片機&#xff0…

Redis如何高效安全的遍歷所有key?

大家好,我是鋒哥。今天分享關于【Redis如何高效安全的遍歷所有key?】面試題。希望對大家有幫助; Redis如何高效安全的遍歷所有key? 超硬核AI學習資料,現在永久免費了! 在 Redis 中,遍歷所有的 key 是一個相對昂貴的…

網易云音樂歌曲導出緩存為原始音樂文件。低調,低調。。。

最近買了個榭蘭圖耳機頭,拿到手第一件事當然是煲機了。弄個舊手機做24小時煲機但是不想再裝多一個網易云音樂,省得一號多登錄會問題。對于軟工男最先想到的肯定是在本地直接播放音樂了,正好自己 有淘寶88VIP聯合會員,于是琢磨著怎…

從Android到鴻蒙:一場本應無縫的轉型-優雅草卓伊凡

從Android到鴻蒙:一場本應無縫的轉型-優雅草卓伊凡看到Android開發者詢問如何轉向鴻蒙,卓伊凡不禁搖頭:真正的Android工程師根本不需要“學習”鴻蒙,只需要簡單查閱文檔即可。近年來,隨著鴻蒙系統的不斷發展&#xff0…

HTML————更實用于后端寶寶們學習的前端

博主主攻后端,但是畢竟要做網站,我們來學習一點前端的知識,一共有三節,學完就能做一點小小的頁面啦;1.1 HTML基礎什么是HTML呢,他是超文本標記語言,還記得HTTP是啥不,HTTP是超文本傳…

Vue.js 核心機制深度學習筆記

Vue核心機制深度學習筆記 概述 本文檔整理自一次深入的 Vue.js 技術討論,涵蓋了響應式系統原理、虛擬 DOM 工作機制、更新策略等核心概念。通過問答形式,旨在幫助開發者徹底理解 Vue.js 的內部運行機制。 目錄 SPA 應用與虛擬 DOM虛擬 DOM 生成與 Di…

通義千問VL-Plus:當AI“看懂”屏幕,軟件測試的OCR時代正式終結!

—— 一位測試老兵的實戰手記:如何用多模態大模型讓Bug無處遁形 深夜11點,某電商App緊急上線前 測試工程師小王盯著第37次失敗的自動化腳本崩潰截圖: “Network Error: Conn3ct1on t1m30ut” 傳統OCR把“timeout”識別成“t1m30ut”&#xff…

Notepad++換行符替換

使用 Postman 測試接口時,有時候會遇到需要發送一篇文章,但是我們需要收到將文章的換行符換成 \n,我們可以通過 Notepad 實現快速替換。 首先,將文章粘貼到 Notepad 中,使用 Ctrl H 快捷鍵打開替換窗口。 查找目標&a…

前饋神經網絡總結

前饋神經網絡由三個主要部分組成:輸入層: 負責接收原始數據,通常對應于特征的維度。隱藏層: 包含一個或多個層,每層由多個神經元組成,用于提取輸入數據的抽象特征。輸出層: 產生網絡的最終預測或…

AI 自動化編程 trae1 體驗 頁面添加富編輯器

體驗總結 目前solo功能未使用過, trae 能夠準確率很高地處理簡單問題,如代碼格式化等。 對于復雜的問題,如涉及代碼組件版本和bug等問題,準確率主要依賴整個互聯網資源庫的分析, 目前準備率一般有時候還不如自己添加…

Java基礎(十四)分布式

一、CAP 理論 CAP 原則,又稱 CAP 定理,指出在分布式系統中,Consistency(一致性)、Availability(可用性)和 Partition tolerance(分區容錯性)這三個特性無法同時滿足&…

接口自動化測試(一)

接口測試1.接口的概念程序內部的接口:程序內部接口指同一程序或系統內不同模塊、組件或類之間的交互點,用于數據傳遞、功能調用或資源共享系統對外的接口:是不同系統、模塊或服務之間進行交互的邊界定義,通常通過預定義的協議、數據格式和通信方式實現。…

單片機外設(七)RTC時間獲取

文章目錄一.RTC介紹二.IMX6ull RTC介紹1.SNVS_HP (high power domain)2.SNVS_LP (low power domain)3.SNVS interrupts and alarms三. SNVS重點寄存器介紹1.SNVS_HP Command(HPCOMR)2.SNVS_HP/SNVS_LP Control register (SNVS_HPCR/SNVS_LPCR)3.SNVS_HP/SNVS_LP 狀態寄存器&…

第1篇:走進日志框架的世界 - 從HelloWorld到企業級應用

前言 在現代企業級應用開發中,日志系統扮演著至關重要的角色。無論是問題排查、性能監控,還是業務分析,都離不開完善的日志記錄。今天,我們將從零開始,手把手教你構建一個現代化的注解驅動日志框架。 為什么需要自定義…

173-基于Flask的微博輿情數據分析系統

基于Flask的微博輿情數據分析系統 - 技術實現與架構設計 本文詳細介紹了一個基于Flask框架開發的微博輿情數據分析系統,包含數據爬取、情感分析、可視化展示等完整功能模塊。 📋 目錄 項目概述技術棧系統架構目錄結構核心功能模塊代碼實現數據可視化部署…

美股期權歷史市場數據波動特性分析

標題:基于本地CSV數據的美股期權分析與應用實踐 在金融量化研究領域,本地CSV數據的高效應用是開展美股期權研究的重要基礎。本文將圍繞美股期權日級別行情數據、波動率分析及策略構建的核心流程,詳細介紹從數據預處理到實際場景落地的關鍵方…

VUE從入門到精通二:ref、reactive、computed計算屬性、watch監聽、組件之間的通信

目錄 一、ref、reactive創建響應式對象 1、ref() 2、reactive() 3、ref和reactive的區別 二、computed計算屬性 1、什么是計算屬性computed 2、計算屬性computed和函數方法的區別 3、計算屬性computed的優勢 三、watch監聽函數 1、什么是watch? 2、基本語…

構建AI智能體:十二、給詞語繪制地圖:Embedding如何構建機器的認知空間

我們理解“蘋果”這個詞,能聯想到一種水果、一個公司、或者牛頓的故事。但對計算機而言,“蘋果”最初只是一個冰冷的符號或一串二進制代碼。傳統的“One-Hot”編碼方式(如“蘋果”是[1,0,0,...],“香蕉”是是[0,1,0,...]&#xff…

突擊復習清單(高頻核心考點)

🔒 鎖的作用與使用(synchronized vs ReentrantLock) 面試官為什么問:考察你對并發編程基礎的掌握程度。 速記答案: 作用:保證線程安全,解決多線程環境下對共享資源訪問的數據不一致問題。 synch…