一篇文章快速搞懂Java對象創建與銷燬

什麼是java對象

包括java的基礎類型、自定義Class 定義的變量。

對象的創建過程

舉個例子,Object o= new Object() 的創建過程是怎麼樣的呢?如下圖所示。

  1. 首先,申請空間。
  2. 創建對象。
  3. 已創建對象地址指向變量。

舉個例子,Object  o= new Object();

對象的結構

對象的結構一般分爲三部分:

  1. markworld。markwold存儲了對象的鎖信息,偏向鎖狀態,分代代年齡,Hash Code等信息。**markcode的存儲的信息根據鎖的狀態進行調整。**如下圖所示。
    在這裏插入圖片描述
  2. 類型 指針,即對象指向它的類元數據的指針,虛擬機通過這個指針來確定這個對象是哪個類的實例。
  3. 對齊部分。由於 HotSpot VM 的自動內存管理系統要求對象對象起始地址必須是8字節的整數倍,換句話說, 就是對象的大小必須是8字節的整數倍。而對象頭部分正好是8字節的倍數( 1 倍 或者 2 倍), 因此,當對象實例數據部分沒有對齊時,就需要通過對齊填充來補全。

對象的內存怎麼過程

如下圖所示。創建對象時:

  1. 先判斷棧空間能不能放入對象,如果可以直接放棧空間,用完直接出棧結束。
  2. 棧空間不夠大的情況,再判Eden空間夠不夠大,如不夠,直接放老年代,最後通過FGC 垃圾回收。
  3. Eden如果夠大,再判斷TLAB(線程本地緩存)是否夠大,夠大放TLAB,通過YGC垃圾回收。
  4. TLAB不夠大,那就放Eden區,通過YGC垃圾回收。

PS:實際TLAB也是放在Eden區,只不過TLAB是線程專屬的,性能更好,優先使用。

在這裏插入圖片描述

Java 對象,你Get到了嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章