java對象的創(chuàng)建過程

  • 面試官:創(chuàng)建java對象有哪幾種方式华临?
  • 小白:new、clone端考、反射雅潭、反序列化。
  • 面試官:那你知道 new 一個對象的時候却特,JVM 做了哪些事嗎扶供?說說具體的過程。
  • 小白:就是 new 一下核偿,然后在堆分配內(nèi)存 ……
  • 面試官:你先回家等通知吧诚欠。

所以你知道 new 一個對象的時候做了哪些事顽染,具體過程是怎樣的嗎漾岳?其實主要經(jīng)歷了如下過程:

  • 檢查類是否加載過;
  • 分配內(nèi)存粉寞;

1. 檢查類是否加載過:

在之前 JVM 系列文章中說過尼荆,類通過 ClassLoader 生成一個模板,這個模板放在方法區(qū)(1.7的實現(xiàn)叫永久代唧垦,1.8的實現(xiàn)叫元空間)捅儒,這個模板就包含了類的結(jié)構(gòu)信息,包括方法、屬性巧还、常量池等鞭莽。 new 一個對象的時候,首先會檢查是否已經(jīng)生成了類的模板麸祷。如果有澎怒,就直接拿來用;如果沒有阶牍,就先加載類生成類的模板喷面。

2. 分配內(nèi)存:

經(jīng)過了第一步之后,就要為對象分配內(nèi)存走孽,這個過程在堆中進行惧辈。分配內(nèi)存有兩種方式,一個叫指針碰撞磕瓷,一個叫空閑列表盒齿。至于具體用哪種方式,取決于堆內(nèi)存是否連續(xù)困食。之前的 JVM 垃圾回收文章中說到過县昂,如果采用標記清除算法進行垃圾回收,就會產(chǎn)生內(nèi)存碎片陷舅,如果是用標記整理倒彰,就不會有內(nèi)存碎片。如果沒有內(nèi)存碎片莱睁,就用指針碰撞待讳,否則就用空閑列表。

  • 指針碰撞:用過的內(nèi)存放一邊仰剿,沒用過的放另一邊创淡,中間有個指針作為分界線,采用該方式為對象分配內(nèi)存時南吮,只需要將指針向未用過的內(nèi)存方向移動對象所需內(nèi)存大小即可琳彩。

  • 空閑列表:有內(nèi)存碎片的時候,虛擬機會維護一個列表部凑,列表記錄了哪些位置的內(nèi)存是可用的露乏,給對象分配內(nèi)存時就會找一塊夠大的內(nèi)存去分配,然后更新列表記錄涂邀。

3. 初始化零值:

什么叫初始化零值瘟仿?你有沒有發(fā)現(xiàn),我們在類中定義的成員變量比勉,是不需要賦初始值也可以使用的劳较,而局部變量驹止,沒進行初始化去使用就會報錯。這是為什么呢观蜗?就是因為在對象的創(chuàng)建過程中有“初始化零值”這一步臊恋。比如定義了一個 int 類型的成員變量,拿來用的時候墓捻,默認值是0捞镰,而不是null,這就是初始化零值毙替。

4. 設(shè)置對象頭:

什么是對象頭岸售?JVM 在存儲對象時,增加的一些標記字段厂画,用于增強對象的功能凸丸,這就是對象頭。java 對象頭包括:

  • Mark word:存儲對象自身的一些數(shù)據(jù)袱院,比如 hashCode屎慢,gc 分代年齡等;

  • Klass pointer:存儲指針忽洛,JVM 通過這個指針來確定該對象是哪個類的實例腻惠;

  • array length:如果對象是數(shù)組,那么還會存儲數(shù)組的長度欲虚。

5. 執(zhí)行init方法:

經(jīng)過上面四個步驟集灌,一個新的 java 對象就已經(jīng)產(chǎn)生了,最后就是執(zhí)行 init 方法复哆,讓對象按照程序猿的意愿欣喧,進行初始化。什么叫按照程序猿的意愿初始化梯找?就是你 new 對象的時候傳了哪些參數(shù)唆阿,屬性值是什么。


內(nèi)存分配的過程中锈锤,如何保證線程安全呢驯鳖?JVM 采用 TLAB + CAS 的方式保證線程安全。

TLAB 就是為每個線程預先在伊甸園區(qū)分配一塊內(nèi)存久免,JVM 要給對象分配內(nèi)存的時候浅辙,首先會用 TLAB,即預先分配的這塊內(nèi)存妄壶,如果不夠摔握,就用 CAS 一直重試寄狼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丁寄,一起剝皮案震驚了整個濱河市氨淌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伊磺,老刑警劉巖盛正,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異屑埋,居然都是意外死亡豪筝,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門摘能,熙熙樓的掌柜王于貴愁眉苦臉地迎上來续崖,“玉大人,你說我怎么就攤上這事团搞⊙贤” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵逻恐,是天一觀的道長像吻。 經(jīng)常有香客問我,道長复隆,這世上最難降的妖魔是什么拨匆? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮挽拂,結(jié)果婚禮上惭每,老公的妹妹穿的比我還像新娘。我一直安慰自己亏栈,他們只是感情好洪鸭,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仑扑,像睡著了一般览爵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镇饮,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天蜓竹,我揣著相機與錄音,去河邊找鬼储藐。 笑死俱济,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钙勃。 我是一名探鬼主播蛛碌,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辖源!你這毒婦竟也來了蔚携?” 一聲冷哼從身側(cè)響起希太,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎酝蜒,沒想到半個月后誊辉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡亡脑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年堕澄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片霉咨。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛙紫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出途戒,到底是詐尸還是另有隱情惊来,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布棺滞,位于F島的核電站裁蚁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏继准。R本人自食惡果不足惜枉证,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望移必。 院中可真熱鬧室谚,春花似錦、人聲如沸崔泵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憎瘸。三九已至入篮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間幌甘,已是汗流浹背潮售。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锅风,地道東北人酥诽。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像皱埠,于是被迫代替她去往敵國和親肮帐。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容