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

檢查

  • 首先去檢查這個指令的參數(shù)是否能在常量池中定位到一個類的符號引用它掂,并且檢查這個符號引用代表的類是否已經(jīng)被加載、解析和初始化過俊啼。

類加載

  • 如果沒有策幼,那必須先執(zhí)行相應(yīng)的類加載過程邑时。

堆分配內(nèi)存

  • 在類加載檢查通過后,接下來虛擬機(jī)將為新生對象分配內(nèi)存特姐。對象所需內(nèi)存的大小在類加載完成后便是可以完全確定的了晶丘。為對象分配空間的任務(wù)等同于把一塊確定大小的內(nèi)存從Java堆中劃分出來。

指針碰撞

  • 假設(shè)Java堆中的內(nèi)存是絕對規(guī)整的唐含,所有用過的內(nèi)存放一邊浅浮,空閑的內(nèi)存放一邊,中間放一個指針作為分界點(diǎn)的指示器捷枯,那所分配的內(nèi)存就是把指針向空閑空間那邊移動一段跟對象大小相等的距離滚秩,這種分配方式就是指針碰撞

空閑列表

  • 如果Java堆中的內(nèi)存并不是規(guī)整的,已使用的內(nèi)存和空閑內(nèi)存相互交錯淮捆,那就沒有辦法簡單的進(jìn)行指針碰撞來分配內(nèi)存了郁油。虛擬機(jī)必須維護(hù)一個列表來記錄哪些內(nèi)存塊是可用的,在分配的時候從列表中找一塊足夠大的空間劃分給對象實(shí)例争剿,并更新列表上的記錄已艰,這種分配方式稱為空閑列表

指針碰撞 VS 空閑列表

  • 選擇那種分配方式由Java堆是否規(guī)整決定,而Java堆是否規(guī)整又由所采用的垃圾收集器是否帶有壓縮整理功能決定蚕苇。
  • 因此哩掺,在使用Serial、ParNew等帶Compact過程的收集器時涩笤,系統(tǒng)采用的分配算法是指針碰撞嚼吞。而使用CMS這種基于Mark-Sweep算法的收集器時盒件,系統(tǒng)通常采用的分配算法是空閑列表

并發(fā)問題

  • 對象創(chuàng)建在虛擬機(jī)中是非常頻繁的,可能出現(xiàn)并發(fā)的情況,解決并發(fā)問題有兩種方案
    • 一種是對分配內(nèi)存空間的動作做同步處理舱禽,實(shí)際上虛擬機(jī)采用CSA配上失敗重試的方式保證更新操作的原子性
    • 另一種是把內(nèi)存分配的動作按照線程劃分在不同的空間之中進(jìn)行炒刁,即每個線程在Java堆中預(yù)先分配一小塊內(nèi)存,稱為本地線程分配緩沖(TLAB(Thread Local Allocation Buffer))誊稚。那個線程要分配內(nèi)存翔始,就在那個線程的TLAB上分配,只有TLAB用完并分配新的TLAB時里伯,才需要同步鎖定城瞎。虛擬機(jī)是否使用TLAB可以使用-XX:+/-UseTLAB參數(shù)來設(shè)定。

初始化零值

  • 內(nèi)存分配完成后疾瓮,虛擬機(jī)需要將分配到的內(nèi)存空間都初始化為零值(不包括對象頭)脖镀,如果使用TLAB,這一工作過程也可以提前至TLAB分配時進(jìn)行狼电。這一步的操作保證了對象的實(shí)例字段在Java代碼中可以不賦初始值就直接使用蜒灰,程序能訪問到這些字段的數(shù)據(jù)類型所對應(yīng)的零值。

對對象進(jìn)行必要的設(shè)置

  • 接下來肩碟,虛擬機(jī)要對對象做必要的設(shè)置强窖,例如這個對象是哪個類的實(shí)例、如何才能找到類的元數(shù)據(jù)信息削祈、對象的哈希碼毕骡、對象的GC分代年齡等信息。這些信息存放在對象的對象頭岩瘦。根據(jù)虛擬機(jī)運(yùn)行狀態(tài)的不同未巫,如是否啟用偏向鎖等,對象頭會有不同的設(shè)置方式启昧。

初始化

  • 在上面的工作都完成后叙凡,從虛擬機(jī)的角度來講,對象已經(jīng)創(chuàng)建完成密末。但是從Java程序的角度來講握爷,對象創(chuàng)建才剛剛開始。init方法還沒有執(zhí)行严里,所有的字段都還為零新啼。所以,一般來說(由字節(jié)碼中是否跟隨invokespecial指令所決定)刹碾,執(zhí)行new指令后會接著執(zhí)行init方法,把對象按照程序的意愿進(jìn)行初始化,這樣一個可用的對象才算是創(chuàng)建成功物舒。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末色洞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冠胯,更是在濱河造成了極大的恐慌火诸,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荠察,死亡現(xiàn)場離奇詭異置蜀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)悉盆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門盾碗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人舀瓢,你說我怎么就攤上這事『拿溃” “怎么了京髓?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長商架。 經(jīng)常有香客問我堰怨,道長,這世上最難降的妖魔是什么蛇摸? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任备图,我火速辦了婚禮,結(jié)果婚禮上赶袄,老公的妹妹穿的比我還像新娘揽涮。我一直安慰自己,他們只是感情好饿肺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布蒋困。 她就那樣靜靜地躺著,像睡著了一般敬辣。 火紅的嫁衣襯著肌膚如雪雪标。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天溉跃,我揣著相機(jī)與錄音村刨,去河邊找鬼。 笑死撰茎,一個胖子當(dāng)著我的面吹牛嵌牺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼髓梅,長吁一口氣:“原來是場噩夢啊……” “哼拟蜻!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起枯饿,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酝锅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奢方,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搔扁,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年蟋字,在試婚紗的時候發(fā)現(xiàn)自己被綠了稿蹲。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹊奖,死狀恐怖苛聘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忠聚,我是刑警寧澤设哗,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站两蟀,受9級特大地震影響网梢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赂毯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一战虏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧党涕,春花似錦烦感、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至骑祟,卻和暖如春回懦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背次企。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工怯晕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人缸棵。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓舟茶,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吧凉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

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