2019-08-18

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


一個(gè)畫不完的圓

①類加載檢查: JVM將類加載過程分為五個(gè)步驟:

1) 裝載:查找并加載類的二進(jìn)制數(shù)據(jù) 况增;

2)? 驗(yàn)證:確保被加載類的正確性众羡;

3)準(zhǔn)備:為類的靜態(tài)變量分配內(nèi)存挫剑,并將其初始化為默認(rèn)值;

4)解析:虛擬機(jī)將常量池內(nèi)的符號引用替換為直接引用的過程畸写;

符號引用(Symbolic References):符號引用以一組符號來描述所引用的目標(biāo)贴铜,符號可以是任何形式的字面量,只要使用時(shí)能無歧義地定位到目標(biāo)即可叹括。

直接引用(Direct References):直接引用可以是直接指向目標(biāo)的指針算墨、相對偏移量或是一個(gè)能間接定位到目標(biāo)的句柄。如果有了直接引用汁雷,那么引用的目標(biāo)一定是已經(jīng)存在于內(nèi)存中净嘀。

5) 初始化:為類的靜態(tài)變量賦予正確的初始值。

比如private static int a = 10侠讯,它的執(zhí)行過程是這樣的挖藏,首先字節(jié)碼文件被加載到內(nèi)存后,先進(jìn)行驗(yàn)證這一步驟厢漩,驗(yàn)證通過后準(zhǔn)備階段膜眠,給a分配內(nèi)存,因?yàn)樽兞縜是static的溜嗜,所以此時(shí)a等于int類型的默認(rèn)初始值0宵膨,即a=0,然后解析,到初始化這一步驟時(shí)炸宵,才把a(bǔ)的真正的值10賦給a,此時(shí)a=10柄驻。靜態(tài)變量是在類裝載時(shí)初始化的,因此在產(chǎn)生對象前就初始化了焙压,這也就是可以使用類名訪問靜態(tài)變量的原因鸿脓。

②分配內(nèi)存: 在類加載檢查通過后,接下來虛擬機(jī)將為新生對象分配內(nèi)存涯曲。對象所需的內(nèi)存大小在類加載完成后便可確定野哭,為對象分配空間的任務(wù)等同于把一塊確定大小的內(nèi)存從 Java 堆中劃分出來。分配方式有 “指針碰撞” 和 “空閑列表” 兩種幻件,選擇那種分配方式由 Java 堆是否規(guī)整決定拨黔,而Java堆是否規(guī)整又由所采用的垃圾收集器是否帶有壓縮整理功能決定。

內(nèi)存分配并發(fā)問題:在創(chuàng)建對象的時(shí)候有一個(gè)很重要的問題绰沥,就是線程安全篱蝇,因?yàn)樵趯?shí)際開發(fā)過程中,創(chuàng)建對象是很頻繁的事情徽曲,作為虛擬機(jī)來說零截,必須要保證線程是安全的,通常來講秃臣,虛擬機(jī)采用兩種方式來保證線程安全:

?1)CAS+失敗重試CAS 是樂觀鎖的一種實(shí)現(xiàn)方式涧衙。所謂樂觀鎖就是哪工,每次不加鎖而是假設(shè)沒有沖突而去完成某項(xiàng)操作,如果因?yàn)闆_突失敗就重試弧哎,直到成功為止雁比。虛擬機(jī)采用 CAS 配上失敗重試的方式保證更新操作的原子性。

2)TLAB為每一個(gè)線程預(yù)先在 Eden 區(qū)分配一塊兒內(nèi)存撤嫩,JVM 在給線程中的對象分配內(nèi)存時(shí)偎捎,首先在 TLAB 分配,當(dāng)對象大于 TLAB 中的剩余內(nèi)存或 TLAB 的內(nèi)存已用盡時(shí)序攘,再采用上述的 CAS 進(jìn)行內(nèi)存分配

③初始化零值: 內(nèi)存分配完成后茴她,虛擬機(jī)需要將分配到的內(nèi)存空間都初始化為零值(不包括對象頭),這一步操作保證了對象的實(shí)例字段在 Java 代碼中可以不賦初始值就直接使用两踏,程序能訪問到這些字段的數(shù)據(jù)類型所對應(yīng)的零值败京。

④設(shè)置對象頭: 初始化零值完成之后兜喻,虛擬機(jī)要對對象進(jìn)行必要的設(shè)置梦染,例如這個(gè)對象是那個(gè)類的實(shí)例、如何才能找到類的元數(shù)據(jù)信息朴皆、對象的哈希嗎帕识、對象的 GC 分代年齡等信息。 這些信息存放在對象頭中遂铡。 另外肮疗,根據(jù)虛擬機(jī)當(dāng)前運(yùn)行狀態(tài)的不同,如是否啟用偏向鎖等扒接,對象頭會(huì)有不同的設(shè)置方式伪货。

⑤執(zhí)行 init 方法: 在上面工作都完成之后,從虛擬機(jī)的視角來看钾怔,一個(gè)新的對象已經(jīng)產(chǎn)生了碱呼,但從 Java 程序的視角來看,對象創(chuàng)建才剛開始宗侦,<init> 方法還沒有執(zhí)行愚臀,所有的字段都還為零。所以一般來說矾利,執(zhí)行 new 指令之后會(huì)接著執(zhí)行 <init>方法姑裂,把對象按照程序員的意愿進(jìn)行初始化,這樣一個(gè)真正可用的對象才算完全產(chǎn)生出來男旗。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末舶斧,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子察皇,更是在濱河造成了極大的恐慌捧毛,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異呀忧,居然都是意外死亡师痕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門而账,熙熙樓的掌柜王于貴愁眉苦臉地迎上來胰坟,“玉大人,你說我怎么就攤上這事泞辐”屎幔” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵咐吼,是天一觀的道長吹缔。 經(jīng)常有香客問我,道長锯茄,這世上最難降的妖魔是什么厢塘? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮肌幽,結(jié)果婚禮上晚碾,老公的妹妹穿的比我還像新娘。我一直安慰自己喂急,他們只是感情好格嘁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著廊移,像睡著了一般糕簿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狡孔,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天懂诗,我揣著相機(jī)與錄音,去河邊找鬼步氏。 笑死响禽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荚醒。 我是一名探鬼主播芋类,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼界阁!你這毒婦竟也來了侯繁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤泡躯,失蹤者是張志新(化名)和其女友劉穎贮竟,沒想到半個(gè)月后丽焊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咕别,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年技健,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惰拱。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雌贱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偿短,到底是詐尸還是另有隱情欣孤,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布昔逗,位于F島的核電站降传,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏勾怒。R本人自食惡果不足惜婆排,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望控硼。 院中可真熱鬧泽论,春花似錦艾少、人聲如沸卡乾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幔妨。三九已至,卻和暖如春谍椅,著一層夾襖步出監(jiān)牢的瞬間误堡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工雏吭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锁施,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓杖们,卻偏偏與公主長得像悉抵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子摘完,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

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

  • 第二部分 自動(dòng)內(nèi)存管理機(jī)制 第二章 java內(nèi)存異常與內(nèi)存溢出異常 運(yùn)行數(shù)據(jù)區(qū)域 程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,174評論 0 2
  • 一 姥饰、java虛擬機(jī)底層結(jié)構(gòu)詳解 我們知道,一個(gè)JVM實(shí)例的行為不光是它自己的事孝治,還涉及到它的子系統(tǒng)列粪、存儲(chǔ)區(qū)域审磁、...
    葡萄喃喃囈語閱讀 1,488評論 0 4
  • 《深入理解Java虛擬機(jī)》筆記_第一遍 先取看完這本書(JVM)后必須掌握的部分。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,108評論 1 34
  • JVM有哪些分區(qū)岂座?程序計(jì)數(shù)器态蒂,java虛擬機(jī)棧,本地方法棧费什,堆吃媒,方法區(qū)。 java棧中存放的是一個(gè)個(gè)棧幀吕喘,每一個(gè)棧...
    irckwk1閱讀 697評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,113評論 1 32