1. 程式人生 > >物件記憶體佈局與物件訪問定位

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

物件記憶體佈局

  1. 物件頭

    1. Mark Word (用與儲存物件自身執行時的資料)
      1. Mark Word的儲存內容
    2. 型別指標(指向類元資料,拓展:在java7中類元資料儲存在方法區('永久代'),java8以元資料區代替)
    3. 陣列長度(一般為32bit)
  2. 例項資料

    1. 例項資料部分是物件真正儲存的有效資訊,也是在程式程式碼中所定義的各種型別的欄位內容。這部分的儲存順序會受到虛擬機器分配策略引數(FieldsAllocationStyle)和欄位在 Java 原始碼中定義順序的影響。

  3. 對齊填充資料

    1. 例如,在HotSpot VM的自動記憶體管理系統要求物件的起始地址必須是8位元組的整數。
    2. 所以顧名思義,就是用於填充資料使其對齊

物件訪問定位

在java棧的本地變量表中,通過reference資料(引用指標)來操作堆上的具體資料

  1. 通過控制代碼操作

    1. 在堆記憶體中有一個控制代碼池,可以理解為是一層代理,只有如果引用地址有改變,只需要改變代理層,既控制代碼的引用地址,不需要改變reference
  2. 直接操作

    1. 物件地址改變,需要改變reference。不過最大的好處是速度快。節省了一層指標定位的開銷。
    2. 由於物件的訪問在java中頻繁,所以也可以節省一筆可觀的成本

相關推薦

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

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

JVM三:物件記憶體佈局物件訪問定位

物件的記憶體佈局 下面重點介紹一下MarkWord(32Bit/64Bit中個為欄位的含義)各欄位的意義會隨物件的鎖狀態而發生變化 物件的訪問定位分為兩種方式;直接指標訪問,控制代碼訪問 控制代碼訪問:Java堆中會劃分出一塊記憶體作為控制代碼池,reference中儲存的是物件的

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

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

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

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

【JVM之記憶體垃圾回收篇】物件例項化記憶體佈局訪問定位

# 物件例項化記憶體佈局與訪問定位 從各自具體的**記憶體分配**上來講 new 的物件放在**堆**中 物件所屬的型別資訊是放在**方法區**的 方法當中的區域性變數放在**棧空間** 這 new 的物件怎麼把三塊粘合到一起 就是這章的內容了 ## 物件例項化 ### 面試題 **美團:** - 物

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

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

物件的建立、記憶體佈局物件訪問定位

前一篇文章我們介紹了Java虛擬機器的執行時資料區域之後,我們大致瞭解了虛擬機器記憶體的概況。接下來,我們將一起學習物件是如何建立、如何佈局 以及如何訪問的。討論這個問題需要限定在具體的虛擬機器和集中在某一個記憶體區域上才有意義。我們這個所說的是Sun的HotSpot虛擬機

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

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

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

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

Java記憶體模型物件揭祕

看了很多個關於Java記憶體模型的部落格,這篇部落格有著獨到的見解. 前言:最近看了《深入jvm》一書,感受頗深,但是不寫點什麼總感覺不是自己的,所以動手捋一捋。主要講的內容是java的記憶體區域,物件的建立,物件的記憶體佈局和物件的訪問方式。 一、java的記憶體區域劃

Java物件記憶體佈局以及物件所需記憶體大小計算詳解

1. 記憶體佈局 在HotSpot虛擬機器中,物件的記憶體佈局可以分為三部分:物件頭(Header)、 例項資料(Instance Data)和對齊填充(Padding)。 1) 物件頭(Header): 物件頭又可以分為兩部分: 第一部分用來儲存物件自身的執行時基本資料資訊。如雜湊碼、GC分代年

附 Java物件記憶體佈局

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

Java記憶體模型物件的探祕

前言:最近看了《深入jvm》一書,感受頗深,但是不寫點什麼總感覺不是自己的,所以動手捋一捋。主要講的內容是java的記憶體區域,物件的建立,物件的記憶體佈局和物件的訪問方式。 一、java的記憶體區域

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

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

C++物件記憶體佈局

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

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

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

JavaSE之面向物件程式設計—類物件下——2

                        &n

JavaSE之面向物件程式設計—類物件下——3

                        &n

JavaSE之面向物件程式設計—類物件下—— 1

一、程式碼塊 在Java語言中我們總是感受到當遇到一個難的東西,就用一個大括號把它括起來,這樣被大括號括起來的程式碼塊就叫程式碼塊。程式碼塊一共有四種:普通程式碼塊、構造塊、靜態塊、同步程式碼塊。下面我們先介紹前三種程式碼塊。 1.普通程式碼塊 定義:普通程式碼塊就是在定義在方法中的程式碼塊

JavaSE之面向物件程式設計—類物件(上)

1.面向物件程式設計簡介: [點一下就可以看到這個內容喲] (https://blog.csdn.net/ZhuiZhuDream5/article/details/83831961) 2.類與物件的定義與使用: [帶你進一步走進java] (https://blog.csdn.net/Zh