走進JVM-對象實例化

??Java 是面向對象的靜態強類型語言,聲明并創建對象的代碼很常見,根據某個類聲明一個引用變量指向被創建的對象,并使用此引用變量操作該對象。在實例化對象的過程中,JVM 中發生了什么化學反應呢?

1.下面從最簡單的 Object ref= new Object();代碼進行分析,利用javap -verbose -p 命令查看對象創建的字節碼如下:
      stack=2, locals=2, args_size=1
         0: new           #2                  // class java/lang/Object
         3: dup
         4: invokespecial #1                  // Method java/lang/Object."<init>":()V
         7: astore_1
         8: return
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
            0       9     0  args   [Ljava/lang/String;
            8       1     1   ref   Ljava/lang/Object;
  • NEW: 如果找不到Class對象,則進行類加載。加載成功后,則在堆中分配內存,從 Object 開始到本類路徑上的所有屬性值都要分配內存。分配完畢之后,進行零值初始化。在分配過程中,注意引用是占據存儲空間的,它是一個變量,占用4個字節。這個指令完畢后,將指向實例對象的引用變量壓入虛擬機棧頂。
  • DUP:在棧頂復制該引用變量,這時的棧頂有兩個指向堆內實例對象的引用變量。如果 <init> 方法有參數,還需要把參數壓入操作棧中。兩個引用變量的目的不同,其中壓至底下的引用用于賦值,或者保存到局部變量表,另個棧頂的引用變量作為句柄調用相關方法。
  • INVOKESPECIAL: 調用對象實例方法,通過棧頂的引用變量調用<init>方法。<clinit> 是類初始化時執行的方法,而 <init> 是對象初始化時執行的方法。
2.前面所述是從字節碼的角度看待對象的創建過程,現在從執行步驟的角來分析。
  • 確認類元信息是否存在。當JVM 接收到 new 指令時,首先在 metaspace內查需要創建的類元信息是否存在。若不存在,那么在雙親委派模式下,使用當前類加載器以ClassLoader+ 包名+類名為 Key進行查找對應的class文件如果沒有找到文件,則拋出 ClassNotFoundException 異常;如果找到,則講行類加載,并生成對應的Class 類對象。
  • 分配對象內存。首先計算對象占用空間大小,如果實例成員變量是引用變量,僅分配引用變量空間即可,即 4 個字節大小,接著在堆中劃分一塊內有給新對象。在分配內存空間時,需要進行同步操作,比如采用CAS( Compar And Swap)失敗重試、區域加鎖等方式保證分配操作的原子性。
  • 設定默認值。成員變量值都需要設定為默認值,即各種不同形式的零值。
  • 設置對象頭。設置新對象的哈希碼、GC信息、鎖信息、對象所屬的類元信息等這個過程的具體設置方式取決于JVM實現。
  • 執行 init 方法。初始化成員變量,執行實例化代碼塊,調用類的構造方法并把堆內對象的首地址賦值給引用變量。
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,115評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,577評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,234評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,621評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,822評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,380評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,128評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,319評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,548評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,048評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,285評論 2 376

推薦閱讀更多精彩內容