JVM學習(四)--對象內存布局

目錄

一、對象內存布局

1、對象的實例化

1.1、你有幾種方式創建對象?

1.2、創建對象的步驟

1.2.1、從字節碼角度看待對象創建過程

1.2.2、從執行步驟角度分析

2、對象的內存布局

2.1、對象頭

2.2、實例數據

2.3、對齊填充

3、對象的訪問定位

3.1、句柄訪問

3.2、直接使用指針訪問

HotSpot使用哪種方式呢?


一、對象內存布局

1、對象的實例化

1.1、你有幾種方式創建對象?

? 1、new ①最常見的方式 ②變形1:Xxx的靜態方法 ③變形2:XxxBuilder/XxxFactory的靜態方法

? 2、Class的newInstance():反射的方式,可以調用空參、帶參的構造器,權限必須是public

? 3、Constructor的newInstance(Xxx):反射的方式,可以調用空參、帶參的構造器,權限沒有要求,實用性更廣

? 4、使用clone():不調用任何構造器,當前類需要實現Cloneable接口,實現clone(),默認淺拷貝

? 5、使用反序列化:從文件中,數據庫中,網絡中獲取一個對象的二進制流,反序列化為內存中的對象

? 6、第三方庫Objenesis,利用了asm字節碼技術,動態生成Constructor對象

1.2、創建對象的步驟

1.2.1、從字節碼角度看待對象創建過程

(1)、下面從最簡單的0bject ref=new object(); 代碼進行分析,利用javap-verbose -p 命令查看對象創建的字節碼如下:

cmd命令執行class

在IDE編譯器上面會被轉換成如下

NEW :如果找不到class對象,則進行類加載。加載成功后,則在堆中分配內存,從0bject開始到本類路徑上的所有屬性值都要分配內存。分配完畢之后,進行零值初始化。在分配過程中,注意引用是占據存儲空間的,它是一個變量,占用4個字節。這個指令完畢后,將指向實例對象的引用變量壓入虛擬機棧頂。

DUP :在棧頂復制該引用變量,這時的棧頂有兩個指向堆內實例對象的引用變量。如果<init>方法有參數,還需要把參數壓人操作棧中。兩個引用變量的目的不同,其中壓至底下的引用用于賦值,或者保存到局部變量表,另一個棧頂的引用變量作為句柄調用相關方法

INVOKESPECIAL:調用對象實例方法,通過棧頂的dup引用變量調用<init>方法

補充:<clinit>是類初始化時執行的方法,而<init>是對象初始化時執行的方法。

面試題:

1、new對象流程?

2、對象創建方法,對象內存分配?

1.2.2、從執行步驟角度分析

1、判斷對象對應的類是否加載、鏈接、初始化

? ? 虛擬機遇到一條new指令,首先去檢查這個指令的參數能否在Metaspace的常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已經被加載、解析和初始化。(即判斷類元信息是否存在)。

  • 如果沒有,那么在雙親委派模式下,使用當前類加載器以classLoader+包名+類名為Key進行查找對應的.class 文件。
  • 如果沒有找到文件,則拋出ClassNotFoundException 異常。。
  • 如果找到,則進行類加載,并生成對應的Class類對象。

2、為對象分配內存

? ? 首先計算對象占用空間大小,接著在堆中劃分一塊內存給新對象。如果實例成員變量是引用變量,僅分配引用變量空間即可,即4個字節大小。

? ? 說明:選擇哪種分配方式由Java堆是否規整決定,而Java堆是否規整又由所采用的垃圾收集器是否帶有壓縮整理功能決定。

? ? ①指針碰撞

? ? ? ? 如果內存規整,使用指針碰撞
? ? 如果內存是規整的,那么虛擬機將采用的是指針碰撞法(BumpThe Pointer)來為對象分配內存。意思是所有用過的內存在一邊,空閑的內存在另外一邊,中間放著一個指針作為分界點的指示器,分配內存就僅僅是把指針向空閑那邊挪動一段與對象大小相等的距離罷了。 如果垃圾收集器選擇的是Serial、ParNew這種基于壓縮算法的,虛擬機采用這種分配方式。 一般使用帶有compact(整理)過程的收集器時,使用指針碰撞。

? ? ②空閑列表

? ? ? ? 如果內存不規整,虛擬機需要維護一個列表,使用空閑列表分配

? ? 如果內存不是規整的,已使用的內存和未使用的內存相互交錯,那么虛擬機將采用的是空閑列表法來為對象分配內存。意思是虛擬機維護了一個列表,記錄上哪些內存塊是可用的再分配的時候從列表中找到一塊足夠大的空間劃分給對象實例,并更新列表上的內容。這種分配方式稱為“空閑列表(Free List)”。

3、處理并發安全問題

? ? 在分配內存空間時,另外一個問題是及時保證new對象時候的線程安全性:創建對象是非常頻繁的操作,虛擬機需要解決并發問題。 虛擬機采用了兩種方式解決并發問題:

  • CAS(Compare And Swap )失敗重試、區域加鎖:保證指針更新操作的原子性;
  • TLAB 把內存分配的動作按照線程劃分在不同的空間之中進行,即每個線程在Java堆中預先分配一小塊內存,稱為本地線程分配緩沖區,(TLAB,Thread Local Allocation Buffer)虛擬機是否使用TLAB,可以通過-XX:+/-UseTLAB參數來設定

4、初始化分配到的空間

? ? 內存分配結束,虛擬機將分配到的內存空間都初始化為零值(不包括對象頭)。這一步保證了對象的實例字段在Java代碼中可以不用賦初始值就可以直接使用,程序能訪問到這些字段的數據類型所對應的零值。

5、設置對象的對象頭

? ? 將對象的所屬類(即類的元數據信息)、對象的Hashcode和對象的GC信息、鎖信息等數據存儲在對象的對象頭中。這個過程的具體設置方式取決于JVM實現。

6、執行init方法進行初始化

? ? 在Java程序的視角看來,初始化才正式開始。初始化成員變量,執行實例化代碼塊,調用類的構造方法,并把堆內對象的首地址賦值給引用變量。

? ? 因此一般來說(由字節碼中是否跟隨有invokespecial指令所決定),new指令之后會接著就是執行方法,把對象按照程序員的意愿進行初始化,這樣一個真正可用的對象才算完全創建出來。

2、對象的內存布局

2.1、對象頭

2.2、實例數據

2.3、對齊填充

3、對象的訪問定位

3.1、句柄訪問

3.2、直接使用指針訪問

HotSpot使用哪種方式呢?



JVM學習(一)

JVM學習(三)--運行時數據區

再小的努力,乘以365都很明顯!
每天??記錄?點點。內容也許不重要,但習慣很重要!
一個程序員最重要的能力是:寫出高質量的代碼!!
有道無術,術尚可求也,有術無道,止于術。
無論你是年輕還是年長,所有程序員都需要記住:時刻努力學習新技術,否則就會被時代拋棄!

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

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

相關文章

SQL每日一題(4)

前言&#xff1a;第四更 雖然已經全部做完了&#xff0c;這套卷子非常推薦&#xff01; 根據題目還原出來的原始表 employees表 idnameagestatus1張三28在崗2李四35在崗3王五42在崗4趙六NULL在崗5錢七58在崗6孫八24在崗7周九31離職8吳十-5在崗9鄭十一45在崗10王十二52在崗 題…

如何做好一份技術文檔?

文章目錄 前言一、技術文檔的核心原則二、技術文檔的類型與場景三、技術文檔的寫作流程3.1 需求分析階段&#xff08;文檔生產的基礎&#xff09;3.2 架構設計階段&#xff08;文檔的骨架搭建&#xff09;3.3 內容開發階段&#xff08;血肉填充&#xff09;3.4 質量保障階段&am…

怎么判斷一個Android APP使用了KMM這個跨端框架

要判斷一個 Android 應用是否使用了 KMM&#xff08;Kotlin Multiplatform Mobile&#xff09; 框架&#xff0c;可以通過以下方法逐步驗證&#xff1a; 一、安裝包結構分析 解壓 APK 將 .apk 文件重命名為 .zip 并解壓&#xff0c;檢查以下特征&#xff1a; ? kotlin/ 目錄&a…

Axure系統原型設計列表版方案

列表頁面是眾多系統的核心組成部分&#xff0c;承擔著數據呈現與基礎交互的重要任務。一個優秀的列表版設計&#xff0c;能夠極大提升用戶獲取信息的效率&#xff0c;優化操作體驗。下面&#xff0c;我們將結合一系列精心設計的列表版方案圖片&#xff0c;深入探討如何打造出實…

HarmonyOS優化應用內存占用問題性能優化四

一、使用purgeable優化C內存 Purgeable Memory是HarmonyOS中native層常用的內存管理機制&#xff0c;可用于圖像處理的Bitmap、流媒體應用的一次性數據、圖片等。應用可以使用Purgeable Memory存放其內部的緩存數據&#xff0c;并由系統根據淘汰策略統一管理全部的purgeable內存…

第一課如何學習課程

讀薄就這些東西 讀厚細節&#xff1b;實現了還是很混沌&#xff08;內功心法&#xff09;-》有個項目&#xff1b;在聽的過程中寫博客&#xff1a;我學了什么&#xff0c;敲代碼&#xff1b; 第二章 網絡-》9.1kv存儲 第三章 基礎組件 &#xff08;API函數、最基礎的底層架構…

Linux 系統不終止進程的情況下關閉長連接

使用 tcpkill 中斷指定 TCP 連接 適用場景&#xff1a;需主動中斷已知源IP或目標端口的連接&#xff0c;無需進程重啟。 安裝 dsniff 工具&#xff08;包含 tcpkill&#xff09;&#xff1a; yum -y install dsniff 捕獲并殺死特定連接&#xff08;例如目標IP 192.168.1.10…

TCP原理解析

目錄 TCP協議概述 1. 基礎尋址段?? ??2. 序列控制段?? ??3. 控制信息段?? ??4. 流量控制段?? ??5. 校驗與應急段?? ??6. 擴展功能段?? ??7. 數據承載段?? TCP原理 確認應答與序列號(安全機制) 超時重傳機制(安全機制) 連接管理機制&…

拋棄傳統P2P技術,EasyRTC音視頻基于WebRTC打造教育/會議/遠程巡檢等場景實時通信解決方案

一、方案背景 隨著網絡通信發展&#xff0c;實時音視頻需求激增。傳統服務器中轉方式延遲高、資源消耗大&#xff0c;WebP2P技術由此興起。EasyRTC作為高性能實時通信平臺&#xff0c;集成WebP2P技術&#xff0c;實現低延遲、高效率音視頻通信&#xff0c;廣泛應用于教育、醫療…

2025年度消費新潛力白皮書470+份匯總解讀|附PDF下載

原文鏈接&#xff1a;https://tecdat.cn/?p42178 過去一年&#xff0c;消費市場在政策驅動與技術迭代中呈現結構性變革。社零總額達487,895億元&#xff0c;實物商品網零額占比27%&#xff0c;線上渠道成為增長引擎。本報告從食品飲料、美妝護膚、家電數碼、服飾戶外四大核心領…

“智”造巨輪啟新程:數字安全的戰略布局

數據就像空氣&#xff0c;無處不在&#xff1b;安全就像呼吸&#xff0c;刻不容緩! 在智能化不斷創新的沃土上&#xff0c;某大型智能家電企業這艘智造巨輪正乘風破浪&#xff0c;駛向數字化的深藍大海。作為全球家電制造的領航者&#xff0c;深知&#xff1a;在這個數字時代&a…

React組件(二):常見屬性和函數

文章目錄 一、defaultProps 和 prop-types使用 defaultProps 設置組件的默認值使用prop-types進行props數據類型的校驗代碼舉例 二、事件綁定原生js做事件綁定使用 React 提供的方法&#xff0c;做事件綁定 三、生命周期函數&#xff1a;shouldComponentUpdate()四、在js代碼中…

redis 進行緩存實戰-18

使用 Redis 進行緩存 Redis 通常被認為只是一個數據存儲&#xff0c;但它的速度和內存中特性使其成為緩存的絕佳選擇。緩存是一種技術&#xff0c;通過將經常訪問的數據存儲在快速的臨時存儲位置來提高應用程序性能。通過使用 Redis 作為緩存&#xff0c;您可以顯著減少主數據…

【Nginx學習筆記】:Fastapi服務部署單機Nginx配置說明

服務部署單機Nginx配置說明 服務.conf配置文件&#xff1a; upstream asr_backend {server 127.0.0.1:8010; }server {listen 80;server_name your_domain.com;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remot…

Qt網絡編程

前言 Qt為了支持跨平臺&#xff0c;對系統網絡編程的API&#xff08;socket API&#xff09;也進行了重新分裝。 實際Qt中進行網絡編程也不一定使用Qt封裝的網絡API&#xff0c;也有可能使用的是系統原生API或者其他第三方框架的API。 若要使用Qt中的網絡編程的API&#xff…

矩陣短劇系統:如何用1個后臺管理100+小程序?技術解析與實戰應用

引言&#xff1a;短劇行業的效率革命 2025年&#xff0c;短劇市場規模已突破千億&#xff0c;但傳統多平臺運營模式面臨重復開發成本高、用戶數據分散、內容同步效率低等痛點。行業亟需一種既能降本增效又能聚合流量的解決方案——“矩陣短劇系統”。通過“1個后臺管理100小程…

嵌入式STM32學習——ESP8266 01S的基礎介紹

簡介 ESP8266 系列模組是深圳市安信可科技有限公司開發的一系列基于樂鑫ESP8266EX的低功耗UART-WiFi芯片模組&#xff0c;可以方便地進行二次開發&#xff0c;接入云端服務&#xff0c;實現手機3/4G全球隨時隨地的控制&#xff0c;加速產品原型設計。 模塊核心處理器 ESP8266 在…

form-create-designer中$inject參數的數據結構及各項屬性說明

FcDesigner 是一款基于Vue的開源低代碼可視化表單設計器工具&#xff0c;通過數據驅動表單渲染。可以通過拖拽的方式快速創建表單&#xff0c;提高開發者對表單的開發效率&#xff0c;節省開發者的時間。并廣泛應用于在政務系統、OA系統、ERP系統、電商系統、流程管理等領域。 …

Jasypt概述及整合SpringBoot實現敏感數據加密

前言 在實際開發中&#xff0c;Spring Boot應用的配置文件中經常包含數據庫密碼、API密鑰等敏感信息。如果這些信息以明文形式存儲&#xff0c;會帶來嚴重的安全隱患。本文將詳細介紹如何使用Jasypt&#xff08;Java Simplified Encryption&#xff09;對Spring Boot配置文件中…

Better Faster Large Language Models via Multi-token Prediction 原理

目錄 模型結構&#xff1a; Memory-efficient implementation&#xff1a; 實驗&#xff1a; 1. 在大規模模型上效果顯著&#xff1a; 2. 在不同類型任務上的效果&#xff1a; 為什么MLP對效果有提升的幾點猜測&#xff1a; 1. 并非所有token對生成質量的影響相同 2. 關…