JVM物件例項化

2021-10-07 18:08:50 字數 974 閱讀 1315

new 最常見的方法

***的靜態方法 ***builder ***factory的靜態方法

class 的 newinstance()

8中能用,9已經標註過時了,反射的方式,只能呼叫空參的構造器,許可權必須是public。

constructor 的 newinstance(***)

反射的方式,可以呼叫空參,帶參,取代了第二個

使用clone()

不呼叫任何的構造器,當前的類需要實現cloneable介面,實現clone()方法

使用反序列化

從檔案中,從網路中獲取乙個物件的二進位製流,還原成物件。

第三方庫objenesis

判斷物件對應的類是否載入,鏈結,初始化

先去metaspace的常量池中定位乙個類的符號引用,檢查這個類是否已被載入。

為物件分配記憶體

如果堆空間記憶體規整,使用指標碰撞分配 。

記憶體不規整,虛擬機器需要維護乙個列表,使用列表分配。

處理併發安全問題

採用cas失敗重試、區域枷鎖保證更新的原子性,每個執行緒預先分配一塊tlab,通過-xx+/-usetlab引數來設定。tlab是堆空間中線程獨有的區域。

初始化分配到的空間

所有屬性設定預設值,保證物件例項欄位在不賦值時可以直接使用

設定物件的物件頭

執行init方法進

list item

行初始化

呼叫構造方法

物件頭(1)執行時元資料

雜湊值,gc分代年齡,鎖狀態標誌,執行緒持有的鎖,偏向執行緒id,偏向時間戳

(2)型別指標

指向了元空間中物件的具體型別

示例資料

說明:它是物件真正儲存的有效資訊,包括程式**中定義的各種型別的字段(包括從父類繼承下來的和本身擁有的字段)

規則:相同寬度的字段總分配在一起

父類中定義的變數會出現在子類之前

對其填充

佔位符的作用。

JVM 物件例項化過程 6個階段

處理併發問題 預設賦值 設定物件頭資訊 顯式初始化 package xyz.xx.chapter10 變數初始化順序測試 xiaoming 30 false 40 public class variableinitialtest 類載入的6個階段 載入類元資訊 分配記憶體 記憶體規整 記憶體不規整 ...

jvm例項物件分配規則

1 物件優先分配在eden區,如果eden區沒有足夠的空間時,虛擬機器執行一次minor gc。2 大物件直接進入老年代 大物件是指需要大量連續記憶體空間的物件 這樣做的目的是避免在eden區和兩個 survivor區之間發生大量的記憶體拷貝 新生代採用複製演算法收集記憶體 3 長期存活的物件進入老...

JVM 類載入 雙親委派 物件例項化過程

下圖為類載入順序 jvm總括四 類載入過程 雙親委派模型 物件例項化過程 簡單例項流程 多執行緒時,物件例項化因為指令重排序問題可能 分配記憶體和物件初始化順序不固定導致執行緒安全問題。如單例的執行緒安全處理 靜態 塊只有類第一次被載入時執行一次。屬性和初始化塊執行順序初始化時,看 寫的順序來決定初...