JAVA JVM對象的實現

jvm分配內存給對象的方式

1. 內存分配的總體流程
對象內存分配的主要步驟:
  1. 類加載檢查:確認類已加載、解析和初始化。
  2. 內存分配:根據對象大小,從堆中劃分內存空間。
  3. 內存初始化:將分配的內存空間初始化為零值(不包括對象頭)。
  4. 設置對象頭:填充對象頭信息(如哈希碼、GC 分代年齡、類型指針等)。
  5. 執行init方法:調用對象的構造函數,初始化成員變量。
2. 內存分配的具體方式
(1)指針碰撞(Bump the Pointer)
  • 適用場景:堆內存絕對規整(所有用過的內存放在一邊,空閑的內存放在另一邊)。
  • 分配方式:JVM 維護一個指針,指向空閑內存的起始位置。分配時,將指針向空閑方向移動對象大小的距離。
  • 優點:高效,僅需移動指針。
  • 缺點:需要內存規整,依賴垃圾回收器(如 Serial、ParNew 等帶有壓縮功能的 GC)。
(2)空閑列表(Free List)
  • 適用場景:堆內存不規整(已使用和空閑內存交錯)。
  • 分配方式:JVM 維護一個記錄空閑內存塊的列表,分配時從列表中找到足夠大的塊,并更新列表。
  • 優點:適合不規整內存,無需內存壓縮。
  • 缺點:分配效率較低,需遍歷列表并維護列表結構。
  • 應用:CMS 等基于 “標記 - 清除” 的垃圾回收器使用此方式。
3. 線程安全的內存分配
對象創建在多線程環境下是線程不安全的,可能出現多個線程同時分配同一塊內存的問題。JVM 采用兩種方式解決:
(1)CAS(Compare-and-Swap)
  • 執行流程:
1. 線程讀取共享變量 V 的當前值
2. 將讀取的值存儲為預期舊值 A
3. 計算需要更新的新值 B
4. 執行 CAS 操作,比較 V 的當前值是否等于 A:- 如果相等(說明期間沒有其他線程修改 V),則原子性地將 V 的值更新為 B- 如果不相等(說明其他線程已修改 V),則操作失敗,通常需要重試或放棄
  • 缺點:若競爭激烈,頻繁的 CAS 失敗會導致性能下降。
(2)TLAB(Thread Local Allocation Buffer)
  • 機制:為每個線程預先分配一小塊私有內存(TLAB),線程內的對象分配優先在 TLAB 中進行,避免同步開銷。

jvm對象的內存布局

在 JVM(Java 虛擬機)中,對象在內存中的布局主要分為三個部分:對象頭(Object Header)實例數據(Instance Data)?和?對齊填充(Padding)
1. 對象頭(Object Header)
對象頭包含兩部分信息:Mark Word?和?類型指針(Class Pointer),某些情況下還會包含?數組長度(如果對象是數組)。
Mark Word
  • 作用:存儲對象的哈希碼、鎖狀態標志、GC 分代年齡等運行時數據。
  • 長度:在 32 位 JVM 中占 32 位(4 字節),64 位 JVM 中占 64 位(8 字節)。
類型指針(Class Pointer)
  • 作用:指向對象的類元數據(Class 對象),JVM 通過這個指針確定對象是哪個類的實例。
  • 長度:32 位 JVM 中占 32 位(4 字節),64 位 JVM 中默認開啟指針壓縮時占 32 位(4 字節),否則占 64 位(8 字節)。
數組長度(可選)
  • 作用:如果對象是數組,對象頭中會額外存儲數組的長度。
  • 長度:32 位(4 字節)。
2. 實例數據(Instance Data)
  • 作用:存儲對象的字段數據,包括父類繼承的和子類定義的字段。
  • 布局規則:
    • 相同寬度的字段被分配在一起(例如,int?和?float?都是 4 字節,可能相鄰)。
    • 父類字段在前,子類字段在后。
    • 遵循 JVM 對齊規則:字段會按照 8 字節對齊(64 位 JVM)。
3. 對齊填充(Padding)
  • 作用:JVM 要求對象的總大小必須是 8 字節的整數倍,不足的部分用填充字節補齊。
  • 原因:提高內存訪問效率,避免跨緩存行訪問。

jvm對象的訪問方式

在 JVM(Java 虛擬機)中,對象的訪問方式主要涉及?引用(Reference)?如何定位到具體的對象實例。JVM 提供了兩種主流的對象訪問方式:句柄訪問?和?直接指針訪問
1. 句柄訪問(Handle Access)
原理
  • 句柄池:JVM 在堆中劃分一塊區域作為句柄池,每個句柄包含兩部分指針:
  • 引用指向:Java 引用(如?Object obj = new Object()?中的?obj)存儲的是句柄池中的句柄地址。
訪問流程
引用變量(棧) → 句柄池(堆) → 對象實例數據(堆)→ 對象類型數據(方法區)
優缺點
  • 優點:引用穩定,對象移動時只需修改句柄中的指針,無需修改引用本身。
  • 缺點:需要兩次指針訪問(先到句柄池,再到對象),性能略低。
2. 直接指針訪問(HotSpot 采用)
原理
  • 引用指向:Java 引用直接存儲對象在堆中的地址,對象的實例數據中包含?類型指針,指向方法區的類元數據。
訪問流程
引用變量(棧) → 對象實例數據(堆) → 對象類型數據(方法區)
優缺點
  • 優點:訪問速度快,只需一次指針訪問。
  • 缺點:對象移動 時需要修改所有引用的指針。
總結
  • 句柄訪問:通過句柄池間接訪問對象,優點是引用穩定,缺點是性能較低。
  • 直接指針訪問:引用直接指向對象,優點是性能高,缺點是對象移動時需修改引用。

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

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

相關文章

CVE-2023-41990/CVE-2023-32434/CVE-2023-38606/CVE-2023-32435

CVE-2023-41990(GitLab 命令注入漏洞)漏洞原理CVE-2023-41990是GitLab CE/EE(社區版/企業版)中項目導出功能的一個命令注入漏洞。具體原理如下:①GitLab在導出項目時,會調用git命令生成項目存檔&#xff08…

RAG實戰指南 Day 8:PDF、Word和HTML文檔解析實戰

【RAG實戰指南 Day 8】PDF、Word和HTML文檔解析實戰 開篇 歡迎來到"RAG實戰指南"系列的第8天!今天我們將深入探討PDF、Word和HTML文檔解析技術,這是構建企業級RAG系統的關鍵基礎。在實際業務場景中,80%以上的知識都以這些文檔格式…

【AXI】讀重排序深度

我們以DDR4存儲控制器為例,設計一個讀重排序深度為3的具體場景,展示從設備如何利用3級隊列優化訪問效率:基礎設定從設備類型:DDR4存儲控制器(支持4個存儲體Bank0-Bank3)讀重排序深度:3&#xff…

牛馬逃離北京(回歸草原計劃)

豐寧壩上草原自駕游攻略(半虎線深度版) 🚗 路線:北京/承德 → 豐寧縣城 → 半虎線 → 大灘鎮(2天1夜) 🎯 核心玩法:免費草原、高山牧場、日落晚霞、牧群互動、星空煙花🌿…

【前端】【Echarts】ECharts 詞云圖(WordCloud)教學詳解

效果ECharts 詞云圖(WordCloud)教學詳解 詞云圖是一種通過關鍵詞的大小、顏色等視覺差異來展示文本數據中詞頻或權重的圖表。它直觀、形象,是數據分析和內容展示中的利器。 本文將帶你從零開始,學習如何用 ECharts 的 WordCloud 插…

【arXiv 2025】新穎方法:基于快速傅里葉變換的高效自注意力,即插即用!

一、整體介紹 The FFT Strikes Again: An Efficient Alternative to Self-AttentionFFT再次出擊:一種高效的自注意力替代方案圖1:FFTNet整體流程,包括局部窗口處理(STFT或小波變換,可選)和全局FFT&#xff…

通過vue如何利用 Three 繪制 簡單3D模型(源碼案例)

目錄 Three 介紹 創建基礎3D場景 創建不同類型的3D模型 1. 球體 2. 圓柱體??????? 3. 平面??????? 加載外部3D模型 添加交互控制 創建可交互的3D場景 Three 介紹 Three.js是一個強大的JavaScript 3D庫,可以輕松地在網頁中創建3D圖形。下面我…

云蝠智能 Voice Agent 落地展會邀約場景:重構會展行業的智能交互范式

一、行業痛點與 AI 破局在會展行業數字化轉型的浪潮中,傳統展會邀約模式面臨多重挑戰:人工外呼日均僅能處理 300-500 通電話,且無效號碼占比高達 40% 以上,導致邀約效率低下。同時,個性化邀約話術設計依賴經驗&#xf…

idea如何打開extract surround

在 IntelliJ IDEA 中,"Extract Surrounding"(提取周圍代碼)通常指 ?將一段代碼提取到新的方法、變量或類中,但更常見的操作是 ??"Surround With"(用代碼結構包圍)?。以下是兩種場景…

window顯示驅動開發—XR_BIAS 和 BltDXGI

Direct3D 運行時調用驅動程序的 BltDXGI 函數,以僅對XR_BIAS源資源執行以下操作:復制到也XR_BIAS的目標未修改的源數據的副本可接受點樣本的拉伸旋轉由于 XR_BIAS 不支持 MSAA) (多個示例抗鋸齒,因此驅動程序不需要解析XR_BIAS資源。核心規則…

web網頁開發,在線%ctf管理%系統,基于html,css,webform,asp.net mvc, sqlserver, mysql

webform,asp.net mvc。數據庫支持mysql,sqlserver經驗心得 每次我們寫crud沒啥技術含量,這沒法讓咱們進入大廠,剛好這次與客戶溝通優化方案建議,咱們就把能加的幫他都加上去。一個ctf管理系統基本crud,并進行不同分層開發&#xf…

面試技術問題總結一

MySQL的幾種鎖機制一、從鎖的粒度角度劃分表級鎖機制:它是對整張表進行鎖定的一種鎖。當一個事務對表執行寫操作時,會獲取寫鎖,在寫鎖持有期間,其他事務無法對該表進行讀寫操作;而當事務執行讀操作時,會獲取…

π0.5的KI改進版——知識隔離:讓VLM在不受動作專家負反饋的同時,繼續輸出離散動作token,并根據反饋做微調(而非凍結VLM)

前言 過去的一個月(25年6.4-7.4),我司「七月在線」具身長沙分部為沖刺一些為客戶來現場看的演示項目,基本都用lerobot的那套框架 比如上周五(7.4日)晚上,通過上周五下午新采的第五波數據做『耳機線插入耳機孔』的任務,推理十次之…

Eigen中Isometry3d的使用詳解和實戰示例

Eigen::Isometry3d 是 Eigen 庫中用于表示 三維空間中的剛性變換(Rigid Transformation) 的類,屬于 Eigen::Transform 模板類的一個特化版本。它結合了 旋轉和平移,廣泛應用于機器人學、SLAM、三維幾何計算等場景。一、核心定義 #…

《未來已來:當人類智慧遇上AI智能體》

在這個充滿奇跡的時代,人類的智慧與科技的力量正以前所未有的速度交織在一起。 我們站在一個新時代的門檻上,一邊是古老而深邃的自然規律,另一邊是充滿可能性的未來世界。 今天,就讓我們一起走進這場關于人類智慧與AI智能體Kimi的對話,看看未來究竟會帶給我們怎樣的驚喜…

【三維生成】FlashDreamer:基于擴散模型的單目圖像到3D場景

標題&#xff1a;<Enhancing Monocular 3D Scene Completion with Diffusion Model> 代碼&#xff1a;https://github.com/CharlieSong1999/FlashDreamer 來源&#xff1a;澳大利亞國立大學 文章目錄摘要一、前言二、相關工作2.1 場景重建2.2 擴散模型2.3 Vision languag…

CANFD記錄儀設備在無人駕駛快遞車的應用

隨著物流行業的快速發展&#xff0c;無人駕駛快遞車因其高效、低成本的優勢&#xff0c;逐漸成為“最后一公里”配送的重要解決方案。然而&#xff0c;無人駕駛系統的穩定性和安全性高度依賴車輛總線數據的精準采集與分析。南金研CANFDlog4 4路記錄儀憑借其多通道、高帶寬、高可…

Kubernetes存儲入門

目錄 前言 一、Volume 的概念 二、Volume 的類型 常見的卷類型 Kubernetes 獨有的卷類型 三、通過 emptyDir 共享數據 1. 編寫 emptyDir 的 Deployment 文件 2. 部署該 Deployment 3. 查看部署結果 4. 登錄 Pod 中的第一個容器 5. 登錄 Pod 中的第二個容器查看/mnt下…

10.Docker安裝mysql

(1)docker pull mysql:版本號eg&#xff1a;docker pull mysql(默認安裝最新版本)docker pull mysql:5.7(2)啟動并設置mysql鏡像docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456 --name mysql1 mysql其他參數都不多講&#xff0c;下面這個參數指的是設置數據庫用戶ro…

Debian-10編譯安裝Mysql-5.7.44 筆記250706

Debian-10編譯安裝Mysql-5.7.44 筆記250706 單一腳本安裝 ### 1. 安裝編譯依賴 sudo apt install -y cmake gcc g build-essential libncurses5-dev libssl-dev \ pkg-config libreadline-dev zlib1g-dev bison curl wget libaio-dev \ libjson-perl libnuma-dev libsystemd-d…