【從零開始學習JVM | 第二篇】HotSpot虛擬機對象探秘

對象的創建

1.類加載檢查

虛擬機遇到一條new的指令,首先去檢查這個指令的參數能否在常量池中定位到這個類的符號引用,并且檢查這個符號引用代表的類是否已被加載過、解析和初始化過。如果沒有,那必須先執行類的加載過程。

2.分配內存

類加載檢查通過后,接下來虛擬機將為新生對象分配內存,對象所需內存在類加載之后便可確定,為對象分配空間的任務等于說從把一塊確定大小的內存從Java堆中劃分出來。分配方式有指針碰撞空閑列表兩種方式,選擇哪種方式由Java堆是否規整決定而 Java 堆是否規整又由所采用的垃圾收集器是否帶有壓縮整理功能決定。

內存分配的兩種方式:

指針碰撞:

適用場景:堆內存規整的情況下(沒有內存碎片)。

原理:用過內存的整合到一邊,沒有用過內存的在另一邊,中間是分界指針,指針向著沒有用過內存的一邊移動對象內存大小位置即可。

空閑列表:

適用場景:堆內存不規整的情況下。

原理:虛擬機會維護一個列表,記錄哪些內存塊是可用的,分配空間時,找一塊內存大小足夠的內存塊來劃分給對象示例,最后更新列表。

內存分配并發問題:

在創建對象時,一個很大的問題就是線程安全,因為在并發場景下,創建對象十分頻繁,作為虛擬機來說,必須保證線程安全,虛擬機有兩種方法來保證線程安全:

CAS+失敗重試:CAS是樂觀鎖實現的一種,如果不了解CAS和樂觀鎖的可以看我之前寫的關于樂觀鎖的博客:【并發編程 | 第四篇】悲觀鎖與樂觀鎖的學習-CSDN博客,所謂樂觀鎖就是,每次操作都不加鎖,而是假設沒有沖突去完成某個操作,如果失敗,就重試直到成功為止。虛擬機利用CAS+重試的方式更新操作的原子性

TLAB:為每一個線程預先在 Eden 區分配一塊兒內存,JVM 在給線程中的對象分配內存時,首先在 TLAB 分配,當對象大于 TLAB 中的剩余內存或 TLAB 的內存已用盡時,再采用上述的 CAS 進行內存分配。

3.初始化零值

內存分配完成后,虛擬機需要將分配到的內存空間都初始化零值,這一步操作保證了對象的示例在Java代碼執行時不需要賦值就可直接使用,程序能訪問到這些字段的數據類型所對應的初始值。

4.設置對象頭

初始化零值完成之后,虛擬機要對對象進行必要的設置,例如這個對象是哪個類的實例、如何才能找到類的元數據信息、對象的哈希碼、對象的 GC 分代年齡等信息。 這些信息存放在對象頭中。 另外,根據虛擬機當前運行狀態的不同,如是否啟用偏向鎖等,對象頭會有不同的設置方式。

5.執行init方法

在上面工作都完成之后,從虛擬機的視角來看,一個新的對象已經產生了,但從 Java 程序的視角來看,對象創建才剛開始,<init> 方法還沒有執行,所有的字段都還為零。所以一般來說,執行 new 指令之后會接著執行 <init> 方法,把對象按照程序員的意愿進行初始化,這樣一個真正可用的對象才算完全產生出來。

對象的內存布局

在HotSpot虛擬機中,對象在內存中的布局可以分為三塊區域:對象頭、實例數據、對齊填充

對象頭包含兩部分信息:

1.標記字段:用于存儲對象自身運行時數據,如哈希碼(HashCode)、GC 分代年齡、鎖狀態標志、線程持有的鎖、偏向線程 ID、偏向時間戳等等。

2.類型指針:對象指向它的類元數據指針,虛擬機通過這個指針來確定它是哪個類的示例對象。

實例數據部分是對象真正存儲的有效信息,也就是在程序中所定義的各種字段的信息。

對齊填充部分不是必然存在的,也沒有什么特別的含義,僅僅起占位作用。因為 Hotspot 虛擬機的自動內存管理系統要求對象起始地址必須是 8 字節的整數倍,換句話說就是對象的大小必須是 8 字節的整數倍。而對象頭部分正好是 8 字節的倍數(1 倍或 2 倍),因此,當對象實例數據部分沒有對齊時,就需要通過對齊填充來補全。

如果我的內容對你有幫助,請點贊,評論,收藏。創作不易,大家的支持就是我堅持下去的動力!

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

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

相關文章

Oracle 表空間高水位收縮全攻略

1. 概述 本文檔是針對某個特定用戶表空間收縮的文檔&#xff0c;實際操作要結合生產庫具體情況。主要包括以下幾個流程&#xff1a; 收集當前數據庫相關信息降低數據庫表高水位線Resize 收縮數據文件 具體細節詳見以下章節。 2. 時間規劃 操作類型預估時間實際時間數據庫信…

Pytest多環境切換實戰:測試框架配置的最佳實踐!

你是否也遇到過這種情況&#xff1a;本地測試通過&#xff0c;一到測試環境就翻車&#xff1f;環境變量錯亂、接口地址混亂、數據源配置丟失……這些「環境切換」問題簡直像定時炸彈&#xff0c;隨時引爆你的測試流程&#xff01; 測試人員每天都跟不同的環境打交道&#xff0…

藍橋杯賽前題

開始每個人能量為3 答題了&#xff0c;答題者1 扣分最后算 #include<bits/stdc.h> using namespace std;const int N1e510; int a[N]; int main(){int n,k,q;cin>>n>>k>>q;for(int i1;i<n;i){a[i]k; }for(int i1;i<q;i){int x;cin>>x;a[…

VSCode優雅的使用debug

原始用法&#xff1a;(這里不使用) 配置launch.json&#xff0c;里面傳入參數然后debug&#xff0c;這里我們通常需要傳入的參數比較多&#xff0c;而且經常修改參數&#xff0c;直接去修改launch.json會比較麻煩&#xff0c;所以使用sh腳本比較方便。 {// Use IntelliSense to…

oracle常見問題處理集錦

oracle常見問題處理集錦 oracle常見問題處理集錦ORA-03001:未實施的功能ORA:28000 the count is locked oracle常見問題處理集錦 ORA-03001:未實施的功能 問題 ORA-03001:未實施的功能 在datagrip中修改表名稱&#xff0c;使用的語法是&#xff1a; rename old_name to new_n…

項目日志配置模板示例

1.新增application.properties配置 logging.configclasspath:logback-spring.xml spring.profiles.activedev 將項目部署到服務器時需要將dev修改為test后再進行打包部署 2.新增logback-spring.xml <?xml version"1.0" encoding"UTF-8"?> <…

2025年第十八屆“認證杯”數學中國數學建模網絡挑戰賽【BC題】完整版+代碼+結果

# 問題一&#xff1a;隨機森林回歸from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 問題二&#xff1a;LSTM時間序列預測from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…

C語言實現TcpDump

一、 在 C 語言中實現 TCP 抓包功能&#xff0c;通常可以使用 libpcap 庫。libpcap 是一個廣泛使用的網絡抓包庫&#xff0c;它提供了捕獲網絡數據包的接口。 libpcap 是一個廣泛使用的 C 語言庫&#xff0c;用于捕獲和過濾網絡數據包。它提供了一個通用接口&#xff0c;用于訪…

Spark-Core編程

sortByKey算子&#xff1a;對(K, V)型RDD按key排序&#xff0c;K需實現Ordered接口&#xff0c;可指定升序或降序及分區數。 join算子&#xff1a;連接兩個(K, V)和(K, W)型RDD&#xff0c;返回(K, (V, W))型RDD 。 leftOuterJoin算子&#xff1a;類似SQL左外連接&#xff0c;返…

閱讀MySQL實戰45講第9天

目錄 一、你的 SQL 語句為什么變“慢” 二、什么情況會引發數據庫的 flush 過程&#xff1f; 三、分析上面四種場景對性能的影響 四、InnoDB 刷臟頁的控制策略 五、原作者小結&#xff1a; 引言&#xff1a; 一條 SQL 語句&#xff0c;正常執行的時候特別快&#xff0c;但是有時…

cin,cin.get(),getchar(),getline(),cin.get line()異同點

文章目錄 1.cin2.cin.get()3.getchar()4.cin.getline()5.getline() 1.cin &#xff08;1&#xff09;cin>>等價于cin.operator>>()&#xff0c;即調用成員函數operator>>()進行讀取數據。 &#xff08;2&#xff09;當cin>>從緩沖區中讀取數據時&…

VMware虛擬機Ubuntu磁盤擴容

VMware中操作&#xff1a; 選擇要擴容的虛擬機&#xff0c;點擊編輯虛擬機設置 打開后點擊磁盤——>點擊擴展&#xff08;注意&#xff1a;如果想要擴容的話需要刪除快照&#xff09; 調整到你想要的容量 點擊上圖的擴展——>確定 然后我們進到虛擬機里面 首先&#…

卷積神經網絡(CNN)可視化網站匯總

深度學習 文章目錄 深度學習前言CNN ExplainerDeep Learning PlaygroundConvNetJSUnderstanding CNN with Interactive Visualizations3Blue1Brown Neural Networks YouTube PlaylistDistill.pubTensorFlow CNN Visualization (TensorBoard)NN-SVGOpenAI Microscope 前言 匯總…

實習技能記錄【3】-----Git操作

1. Git是什么 Git 是一個分布式版本控制系統 (Distributed Version Control System, DVCS)。 它的核心目標是跟蹤文件的變化&#xff0c;讓你能夠隨時記錄、回溯、協作和管理你的項目。 2. 介紹 2.1 Git 工作區、暫存區、本地倉庫介紹 區域名稱英文名說明相關命令工作區Wor…

藍橋杯單片機刷題——按鍵設置當前采集距離為距離參數

設計要求 驅動超聲波傳感器&#xff0c;啟動距離測量功能,并將其結果顯示到數碼管上。 按鍵“S5”定義為參數按鍵&#xff0c;按下S5按鍵&#xff0c;設備自動將當前采集的距離數據作為距離參數&#xff1b; 若測量的距離數據超過距離參數&#xff0c;指示燈L1點亮&#xff…

KV Cache大模型推理加速功能

KV Cache KV Cache是大模型標配的推理加速功能&#xff0c;也是推理過程中&#xff0c;顯存資源巨大開銷的元兇之一。在模型推理時&#xff0c;KV Cache在顯存占用量可達30%以上。 目前大部分針對KV Cache的優化工作&#xff0c;主要集中在工程上。比如著名的VLLM&#xff0c…

Windows 圖形顯示驅動開發-WDDM 2.0功能_上下文監視

功能概述 上下文監視機制是GPU與CPU協同計算的核心同步技術&#xff0c;通過受監視圍欄&#xff08;Monitored Fence&#xff09;實現跨硬件單元的高效協調。其核心目標是解決以下場景的同步需求&#xff1a; GPU引擎間同步&#xff1a;例如在多渲染管線中&#xff0c;后處理…

基于YOLOv8的機場跑道異物檢測識別系統:提升航空安全的新一代解決方案(主頁有源碼)

?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連 ? ?個人主頁歡迎您的訪問 ?期待您的三連? ??? ????????? ?? 1. 機場跑道異物檢測領域概述 機場跑道異物(Foreign Object Debris, FOD)是指存在于機場跑道、滑行道等關…

網絡協議學習

最近在適配ESP32的網絡驅動&#xff0c;借此機會先學習一下網絡通信協議。 以太網幀、IP包及TCP與UDP的報文格式一文讀懂網絡報問中的檢驗和&#xff08;checksum&#xff09;—— 原理舉例代碼 提問騰訊元寶提示詞&#xff1a; TCP窗口是干什么的擁塞窗口是什么的

fit 轉 gpx

新增 fit 轉 gpx 功能 https://fittools.cc/home/fit2gpx