1. 程式人生 > >深入理解java虛擬機器之HotSpot虛擬機器探祕

深入理解java虛擬機器之HotSpot虛擬機器探祕

一、物件的建立

  1. 虛擬機器遇到一條new指令時,首先將去檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已被載入、解析和初始化過。如果沒有,則先執行相應的類載入過程。
  2. 接下來虛擬機器將為新生物件分配記憶體。物件所需記憶體的大小在類載入完成後便可完全確定。
    • 假設java堆記憶體是絕對規整的,所有用過的記憶體都放在一邊,空閒的記憶體放在另一邊,中間放著一個指標作為分界點的指示器,那所分配記憶體就是僅僅是把那個指標向空閒空間那邊挪動一段與物件大小相等的距離。稱為“指標碰撞”。
    • 如果java堆中記憶體不是規整的,虛擬機器就維護一個列表,記錄哪些記憶體塊是可用的,在分配時候從列表中找到一塊足夠大的空間劃分給物件例項,並更新列表上的記錄,這種分配方式稱為“空閒列表”。
      選擇哪種分配方式由java堆是否規整決定,而java堆是否規整又由所採用的垃圾收集器是否帶有壓縮整理功能決定。
  3. 虛擬機器需要將分配到的記憶體空間都初始化為零值,如果使用TLAB(本地執行緒分配緩衝),這一工作過程也可以提前至TLAB分配時進行。
  4. 虛擬機器要對物件進行必要的設定。必要資訊都會存放在物件的物件頭之中。
  5. 執行new指令之後會接著執行<init>方法,把物件按照程式設計師的意願進行初始化。

二、物件記憶體佈局

物件在記憶體中儲存的佈局可以分為3塊區域:物件頭(Header)、例項資料(instance Data)和對齊填充(Padding)。
  • 物件頭包含兩部分資訊:第一部分用於儲存物件自身的執行時資料
    。這部分資料的長度在32位和64位的虛擬機器(未開啟壓縮指標)中分別為32bit和64bit,稱為“Mark Word”;第二部分是型別指標,即物件指向它的類元資料的指標,虛擬機器通過這個指標來確定這個物件是哪個類的例項。
    如果物件是java陣列,那在物件頭中還必須有一塊用於記錄陣列長度的資料。
  • 例項資料儲存物件真正的有效資訊,就是程式程式碼中定義的各種型別的欄位內容。
  • 對齊填充並不是必然存在,也沒有特別的含義,它僅僅起著佔位符的作用。

三、物件訪問定位

物件的訪問方式取決於虛擬機器實現而定的,目前主流的訪問方式有使用控制代碼和直接指標兩種

  • 使用控制代碼訪問的話,在堆中會劃出一塊記憶體來作為控制代碼池,reference中儲存的就是物件的控制代碼地址,而控制代碼中包含了物件例項資料與型別資料各自的具體的地址資訊

  • 使用直接指標訪問,堆物件的佈局就必須考慮如何放置訪問型別資料的相關資訊,而reference中儲存的直接就是物件地址。
使用控制代碼好處就是物件移動時只會改變控制代碼中的例項資料指標,而reference本身不需要修改。 使用直接指標訪問方式最大好處就是速度更快。 參考自《深入理解Java虛擬機器》

相關推薦

深入理解java虛擬機器HotSpot虛擬機器探祕

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

深入理解Java併發包ConcurrentHashMap

【宣告】本部落格大部分內容來自公眾號ImportNew HashMap的容量由負載因子決定,插入的元素超過了容量的範圍就會觸發擴容操作,就是rehash。 在多執行緒環境下,若同時存在其他元素進行put操作,如果hash值相同,可能出現在同一陣列下用連結串列

深入理解Java記憶體模型系列篇

確保對記憶體的讀-改-寫操作原子執行。在Pentium及Pentium之前的處理器中,帶有lock字首的指令在執行期間會鎖住匯流排,使得其他處理器暫時無法通過匯流排訪問記憶體。很顯然,這會帶來昂貴的開銷。從Pentium 4,Intel Xeon及P6處理器開始,intel在原有匯流排鎖的基礎上做了一個很有意

深入理解Java虛擬機器—JVM高階特性與實踐 周志明 著》第2章 Java記憶體區域與記憶體溢位異常

1、Java虛擬機器所管理的記憶體包括以下幾個執行時資料區域: 2、程式計數器:          1. 可以看作是當前執行緒所執行的位元組碼的行號指示器,是一塊較小的記憶體空間;  &nbs

深入理解Java虛擬機器—JVM高階特性與實踐 周志明 著》第1章 走近Java

1、Java的技術體系主要由支撐Java程式執行的虛擬機器、提供各開發領域介面支援的Java API、Java程式語言及許多第三方Java框架(如spring、Struts等)構成。 2、Java的優點:        &

深入理解Java虛擬機器物件

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

深入理解Java虛擬機器執行時資料區域

一.執行時資料區域有哪些? 首先,我們先來看一張圖: 如上面的圖所示,執行時記憶體區域主要分為:1.程式計數器,2.Java虛擬機器棧,3.本地方法棧,4.Java堆,5.方法區等等,下面就一個個來剖析一下。 二.這些區域都有哪些作用? 首先我們熟悉一下一個一般性的 Java 程式的

深入理解java虛擬機器自動記憶體管理機制(二)

垃圾收集演算法     java中的記憶體是交給虛擬機器管理的。要實現垃圾回收,必須考慮如下三個問題:     1. 哪些記憶體需要回收?     2. 什麼時候回收?     3. 怎麼回收?     對於第一點,往大了來說,是堆和方法區的記憶體需要回收。往具體了來說,是堆中哪些物件的記憶體可以回

深入理解java虛擬機器自動記憶體管理機制(三)

  各類垃圾收集器與GC日誌 (一)垃圾收集器   一、Serial收集器     最基本、歷史最悠久的收集器。使用複製演算法,用在新生代,通常老年代用Serial old配合。GC過程需要stop the world。適用於client模式下的虛擬機器。   二、ParNew收集器  

深入理解java虛擬機器自動記憶體管理機制(四)

記憶體分配與回收策略 (一)記憶體分配策略     給誰分配?分配到哪?是記憶體分配策略必須解答的問題。     java物件是分配的物件,往大方向來說,是分配到堆中,更細一點說,根據物件不同的特點分配到新生代和老年代區域。如果啟動了本地執行緒分配緩衝,就按執行緒優先在TLAB上分配。     一、新

讀書筆記深入理解Java虛擬機器

深入理解Java虛擬機器 2.2 執行時資料區域 2.2.1.程式計數器 可以看做是當前執行緒所執行的位元組碼的 行號指示器。 每個執行緒都需要一個 獨立的程式計數器。(這類記憶體區域為"執行緒私有"的記憶體

深入理解Java虛擬機器(三)垃圾收集

深入理解Java虛擬機器系列文章 垃圾收集演算法 標記-清除演算法 最基礎的收集演算法,包括“標記”和“清除”2個階段 首先標記出所有需要回收的物件,標記過程見前文的2次標記,標記完以後統一回收所有

深入理解Java虛擬機器(七)Java記憶體模型

深入理解Java虛擬機器系列文章 Java記憶體模型規定了所有的變數都儲存在主記憶體,每個執行緒都有自己的工作記憶體,執行緒中的工作記憶體儲存了被該執行緒使用到的變數的主記憶體的副本拷貝。執行緒對變

深入理解Java虛擬機器讀書筆記1----Java記憶體區域與HotSpot虛擬機器物件

一 Java記憶體區域與HotSpot虛擬機器物件 1 Java技術體系、JDK、JRE?     Java技術體系包括:         · Java程式設計語言;   

深入理解java虛擬機器JVM調優配置

轉載文章:http://blog.csdn.net/sivyer123/article/details/17139443 堆記憶體設定 原理 JVM堆記憶體分為2塊:Permanent Space 和 Heap Space。 Permanent 即 持久代(Pe

深入理解Java虛擬機器讀書筆記(2): 深入理解HotSpot虛擬機器物件

深入理解Java虛擬機器讀書筆記(2): 深入理解HotSpot虛擬機器物件 為了理解虛擬機器中資料的細節,比如如何建立、如何佈局以及如何訪問,必須具體到某一虛擬機器和某一個記憶體區域。此處深入探討HotSpot虛擬機器在Java堆中物件分配、佈局和訪問的全過程。 一、物件的建立

深入理解Java虛擬機器》學習筆記垃圾收集器與記憶體分配策略

一、概述 GC(Garbage Collection)需要完成的三件事 (1)哪些記憶體需要回收 (2)什麼時候回收 (3)如何回收 GC主要面向Java堆和方法區中的記憶體 原因:這部份

[連載] 深入理解Java虛擬機器(JVM高階特性與最佳實踐) 【走近Java

連載目錄 :    http://blog.csdn.net/u010903284/article/details/53117958 1.1 Java概述:               Java 不僅僅是一門程式語言,還是一個由一系列計算機軟體和規範形成的技術體系,這個技

深入理解Java虛擬機器虛擬機器位元組碼執行引擎

執行引擎是java虛擬機器最核心的組成部分之一。 物理機的執行引擎是建立在處理器、硬體、指令集和作業系統層面上的,而虛擬機器的執行引擎是由自己實現的,可以自行制定指令集與執行引擎的結構體系,並且能夠執行那些硬體不直接支援的指令集格式。 執行引擎在執行Java

深入理解java虛擬機器》學習筆記編譯優化技術

鄭重宣告:本片部落格是學習<深入理解Java虛擬機器>一書所記錄的筆記,內容基本為書中知識. Java程式設計師有一個共識,以編譯方式執行原生代碼比解釋方式更快,之所以有這樣的共識,除去虛擬機器解釋執行位元組碼時額外消耗時間的原因外,還有一個很重要