1. 程式人生 > >附 Java物件記憶體佈局

附 Java物件記憶體佈局

注意:本篇部落格,主要參考自《深入理解Java虛擬機器(第二版)》

1、物件在記憶體中儲存的佈局分為三塊

  • 物件頭
    • 儲存物件自身的執行時資料:Mark Word(在32bit和64bit虛擬機器上長度分別為32bit和64bit),包含如下資訊:
      • 物件hashCode
      • 物件GC分代年齡
      • 鎖狀態標誌(輕量級鎖、重量級鎖)
      • 執行緒持有的鎖(輕量級鎖、重量級鎖)
      • 偏向鎖相關:偏向鎖、自旋鎖、輕量級鎖以及其他的一些鎖優化策略是JDK1.6加入的,這些優化使得Synchronized的效能與ReentrantLock的效能持平,在Synchronized可以滿足要求的情況下,優先使用Synchronized
        ,除非是使用一些ReentrantLock獨有的功能,例如指定時間等待等。
    • 型別指標:物件指向類元資料的指標(32bit-->32bit,64bit-->64bit(未開啟壓縮指標),32bit(開啟壓縮指標))
      • JVM通過這個指標來確定這個物件是哪個類的例項(根據物件確定其Class的指標)

  • 例項資料:物件真正儲存的有效資訊
  • 對齊填充
    • JVM要求物件的大小必須是8的整數倍,若不是,需要補位對齊

2、注意

  • Mark Word具有非固定的資料結構,以便在極小的空間記憶體儲儘量多的資訊
  • 如果物件是一個數組,物件頭必須有一塊兒用於記錄陣列長度的資料。JVM可以通過Java物件的元資料確定物件長度,但是對於陣列不行。
  • 對於物件頭長度而言
    • 32bit虛擬機器一定是32bit+32bit,即8位元組
    • 64bit虛擬機器若沒有開啟了壓縮指標,是64bit+64bit,即16位元組,若開啟了壓縮指標,是64bit+32bit,即12位元組(不是8bit的倍數)
    • -XX:+UseCompressedOops:開啟壓縮指標
    • 在《深入理解Java虛擬機器(第二版)》中,說物件頭是8位元組或16位元組,不知道是不是有誤,自己的系統不是64bit,沒有測試
  • 基本資料型別與對應包裝類的選用

在實際使用中,我們會根據位元組數較小的一方來選用基本資料型別還是使用其包裝類。

相關推薦

Java物件記憶體佈局

注意:本篇部落格,主要參考自《深入理解Java虛擬機器(第二版)》 1、物件在記憶體中儲存的佈局分為三塊 物件頭 儲存物件自身的執行時資料:Mark Word(在32bit和64bit虛擬機器上長度分別為32bit和64bit),包含如下資訊: 物件hashCode 物件GC分代年齡

java物件記憶體佈局中的基本型別欄位排列順序

java物件記憶體佈局: mark word class物件指標 類欄位 補齊位 如果是陣列物件,2、3之間應該加上  陣列長度 佈局排列表: 32位jdk 普通物件 32位jdk 陣列物件

c++物件記憶體佈局模型

轉自:點選開啟連結 首先介紹一下C++中有繼承關係的類物件記憶體的佈局:  在C++中,如果類中有虛擬函式,那麼它就會有一個虛擬函式表的指標__vfptr,在類物件最開始的記憶體資料中。之後是類中的成員變數的記憶體資料。  對於子類,最開始的記憶體資料記錄著父類物件的拷貝

JVM學習之物件記憶體佈局物件

本篇內容來自《深入理解Java虛擬機器_JVM高階特性與最佳實踐》,感謝作者。 建立物件之後需要使用物件,java中除了對物件屬性方法的呼叫以外還有加鎖實現同步等其他操作,這裡的鎖加在了哪裡,如何記錄鎖,如何對鎖進行分類(有物件鎖,class鎖),垃圾回收機制中有關於GC的

3、物件記憶體佈局 物件訪問定位

物件佈局 * 物件頭 (兩個部分) * 執行時資料:雜湊碼,GC分代年齡,鎖狀態標誌,執行緒持有鎖,偏向執行緒ID,偏向時間戳等 * 型別指標:指向本類。。確定 是那個類的例項。但是查詢(查詢物件的元資料資訊不一定經過物件本身)。 * 如果物

Ehcache計算Java物件記憶體大小

在EHCache中,可以設定maxBytesLocalHeap、maxBytesLocalOffHeap、maxBytesLocalDisk值,以控制Cache佔用的記憶體、磁碟的大小(注:這裡Off Heap是指Element中的值已被序列化,但是還沒寫入磁碟的狀態,貌似只有企業版的EHCache支援這種配

計算Java物件記憶體大小

摘要 本文以如何計算Java物件佔用記憶體大小為切入點,在討論計算Java物件佔用堆記憶體大小的方法的基礎上,詳細討論了Java物件頭格式並結合JDK原始碼對物件頭中的協議欄位做了介紹,涉及記憶體模型、鎖原理、分代GC、OOP-Klass模型等內容。最後推薦JDK自帶的Hotspot De

Java物件記憶體儲存,引用傳遞,值傳遞詳細圖解

問題: Java在呼叫函式時,物件作為引數傳遞,執行函式後引數物件的值是否發生改變。 正文: 在解決這個問題之前首先得說說Java物件在記憶體中的儲存機制。 我們知道Java資料型別基本分為兩種,一是基本型別,還一種是引用型別。 基本型別: 物件型別

JAVA物件記憶體表示

      java設計者的意圖是想使程式設計師不要去關心物件的記憶體表示,這樣才能使java更容易使用,但我們瞭解一些儲存的細節和原理會有助於我們設計出更合理的程式碼。例類:*  class A{*      private int x;*      private st

圖說C++物件模型:物件記憶體佈局詳解

正文回到頂部0.前言文章較長,而且內容相對來說比較枯燥,希望對C++物件的記憶體佈局、虛表指標、虛基類指標等有深入瞭解的朋友可以慢慢看。 本文的結論都在VS2013上得到驗證。不同的編譯器在記憶體佈局的細節上可能有所不同。 文章如果有解釋不清、解釋不通或疏漏的地方,懇請指出。回到頂部1.何為C++物件模型?引

物件記憶體佈局物件訪問定位

物件記憶體佈局 物件頭 Mark Word (用與儲存物件自身執行時的資料) Mark Word的儲存內容 型別指標(指向類元資料,拓展:在java7中類元資料儲存在方法區('永久代'),java8以元資料區代替) 陣列長度(一般為

java物件記憶體到底佔用多少

一個Java物件到底佔用多大記憶體 Java物件的記憶體佈局:物件頭(Header),例項資料(Instance Data)和對齊填充(Padding) 物件佔用的記憶體大小還受到VM引數是否開啟指標壓縮UseCompressedOops的影響

C++物件記憶體佈局

想要研究物件的記憶體佈局必須要去對應的記憶體去檢視。 一、兩種檢視物件記憶體的方法 先選擇我們寫的C++原始檔,右鍵選擇屬性,在彈出的對話方塊中選擇左側的C/C++->命令列,然後在其他選項這裡寫上/d1reportAllClassLayout,它可以看到所有相關類

JVM(2)——HotSpot虛擬機器:物件建立、物件記憶體佈局物件的訪問定位

物件的建立 步驟1:檢查。虛擬機器遇到一條new指令時,首先將去檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被載入、解析和初始化過。如果沒有,那必須先執行相應的類載入過程。 步驟2:分記憶體。在類載入檢查通過後

JAVA物件記憶體逃逸技術

“棧的優勢是,存取速度比堆要快,僅次於暫存器,棧資料可以共享。但缺點是,存在棧中的資料大小與生存期必須是確定的,缺乏靈活性。棧中主要存放一些基本型別的變數(,int, short, long, byt

「每日五分鐘,玩轉JVM」:物件記憶體佈局

概覽 一個物件根據不同情況可以被劃分成兩種情況,當物件是一個非陣列物件的時候,物件頭,例項資料,對齊填充在記憶體中三分天下,而陣列物件中在物件頭中多了一個用於描述陣列物件長度的部分 物件頭 物件頭分為兩部分,第一部分稱之為"Mark Word",第二部分是用於獲取該物件型別的型別指標,

Synchronized加鎖、鎖升級和java物件記憶體結構

首先了解一下JMM中定義的記憶體操作: 一個執行緒操作資料時候都是從主記憶體(堆記憶體)讀取到自己工作記憶體(執行緒私有的資料區域)中再進行操作。對於硬體記憶體來說,並沒有工作記憶體和主記憶體的區分,這都是java記憶體模型劃分出來的,它只是一種抽象的概念,是一組規則,並不是實際存在的。Java記憶體模型中定

Java 物件記憶體分析

> 一直對堆記憶體和棧記憶體搞不明白,最近看了一個視訊,有了新的瞭解,在這裡給大家分享一下 ### 物件記憶體與引用 #### 物件 好多剛入門學習 Java 的人總是搞不清楚類和物件的關係,在這裡簡要說明一些。 類:顧名思義,一類東西,比如女孩、男孩、人、狗狗,都是類(class),瑩瑩、小明、團團

Java 物件記憶體佈局

一個Java 物件在在記憶體中的儲存佈局分為3 塊區域(HostSpot VM): 物件頭(Header) 例項資料(Instance Data) 對齊填充 1. 物件頭 物件頭的資訊主要包括兩個部分: Mark Word 型別指標

讀書筆記《深入理解Java虛擬機器》 (二)物件建立、記憶體佈局、訪問定位

物件的建立 類載入檢查 檢查這個指令的引數是否能在常量池中定位到一個類的引用 檢查這個符號引用代表的類是否已被載入、解析和初始化過, 如果沒有,那必須先執行相應的類載入過程 確定物件所需記憶體的大小 為新生物件分配記憶體 初始化物件的欄位, 大