當前位置:
首頁 > 知識 > jvm 內存管理-hotspot虛擬機對象創建

jvm 內存管理-hotspot虛擬機對象創建

創建對象通常是new 來完成

虛擬機收到一條new指令,首先檢查該指令的參數能否在常量池定位到一個類的符號引用,並檢查符號引用代表的類,是否已被載入,解析,初始化,如沒有,先執行相應的類載入過程。

類載入檢查通過後,虛擬機為新生對象分配內存,對象所需內存大小在類載入完成後可完全確定。

對象分配空間:把一塊確定大小的內存從java堆中分出來

  1. 指針碰撞

    :內存絕對規整,用過的和空閑的內存各放一邊,中間放指針作為分界點指示器,分配內存僅是將指針向空閑空間挪動一段與對象大小相等的舉例,Serial,ParNew等帶Compact過程的收集器時採用指針碰撞
  2. 空閑列表

    :java堆中內存不是絕對規整的,虛擬機需維護一個列表來記錄哪一塊內存是可用的,再分配時從列表找一塊足夠大的空間劃分給對象實例,並更新列表記錄,CMS基於Mark-Sweep演算法的收集器,採用空閑列表。
  3. 對象創建是非常頻繁的操作,並發情況下不是線程安全的。
  • 分配內存空間同步處理:

    虛擬機採用CAS加失敗重試,保證更新操作的原子性

  • 內存分配的動作按線程劃分不同空間中進行:

    每個java堆預先分配一小塊內存,稱為本地線程分配緩衝(TLAB),線程需分配內存,在對應TLAB分配,TLAB用完分配新的TLAB,需同步鎖定,虛擬機是否需要使用TLAB,-XX:+-UseTLAB設定
  • 初始化零值

    :內存分配完成後,虛擬機需將分配的內存空間初始化零值(不包括對象頭),如果使用TLAB,需要在分配TLAB時進行,這個操作保證對象的實例欄位在Java代碼不賦初始值訪問這些欄位數據類型所對應的零值
  • 虛擬機對對象必要的設置:

    如對象是哪個類的實例,如何找到類的元數據信息,對象哈希碼,對象的GC分代年齡等,這些信息存放在對象的對象頭中。
  • 至此,對虛擬機來說,一個對象已經產生了,而從java程序來看,還需執行init方法,真正可用的對象才算產生,new 指令後是否需要init,由invokespecial指令決定

jvm 內存管理-hotspot虛擬機對象創建

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Linux 常用基本命令 rmdir rm
JSP和Servlet初級知識點總結

TAG:程序員小新人學習 |