《深入理解Java虛擬機:JVM高級特性與最佳實踐》讀書筆記(二)

HotSpot虛擬機對象探秘

對象的創(chuàng)建

在類加載檢查通過后,接下來虛擬機將為新生對象分配內(nèi)存渊胸。對象所需內(nèi)存的大小在類加載完成后便可以完全確定。

假設(shè)當Java堆中內(nèi)存時絕對規(guī)則的,即所有用過的內(nèi)存放在一邊踊东,空閑的在另一邊贰健,中間放著一個指針作為分界點的指示器胞四。那么分配內(nèi)存就是把指針向空閑區(qū)域挪動一段與對象大小相等的距離,這種分配方式成為“指針碰撞”伶椿。

當Java堆中的內(nèi)存并不是規(guī)則的辜伟,已使用的內(nèi)存和空閑的內(nèi)存相互交錯,虛擬機就必須維護一個列表脊另,記錄上那些內(nèi)存塊是可用的导狡。在分配時,從列表中找到一塊足夠大的空間劃分給對象實例尝蠕,并更新表上的記錄烘豌,這種分配方式稱為“空閑列表”。

選擇哪種分配方式由Java堆是否規(guī)整決定看彼,而Java堆是否規(guī)整又由所采用的垃圾收集器是否帶有壓縮整理功能決定廊佩。因此,在使用Serial靖榕、ParNew等帶Compact過程的收集器時标锄,系統(tǒng)采用的分配算法是指針碰撞,而使用CMS這種基于Mark-Sweep算法的收集器時茁计,通常采用空閑列表料皇。

虛擬機如何解決在并發(fā)情況下頻繁創(chuàng)建對象帶來的線程不安全問題谓松?

解決這個問題有兩種方案,一種是分配內(nèi)存空間的動作進行同步處理——實際上虛擬機采用CAS(注)配上失敗重試的方式保證更新操作的原子性践剂;另一種是把內(nèi)存分配的動作按照線程劃分在不同的空間中進行鬼譬,即每個線程在Java堆中預先分配一小塊內(nèi)存,稱為本地線程緩沖(TLAB)逊脯。哪個線程要分配內(nèi)存优质,就在哪個線程的TLAB上分配,只有TLAB用完并分配新的TLAB時军洼,才需要同步鎖定巩螃。虛擬機是否使用TLAB,可以通過-XX:+/-UseTLAB參數(shù)來設(shè)定匕争。

注:CAS避乏,Compare and Swap即比較并替換,設(shè)計并發(fā)算法時常用到的一種技術(shù)甘桑。CAS有三個操作數(shù):內(nèi)存值V拍皮、舊的預期值A(chǔ)、要修改的值B跑杭,當且僅當預期值A(chǔ)和內(nèi)存值V相同時春缕,將內(nèi)存值修改為B并返回true,否則什么都不做并返回false艘蹋。

CAS的內(nèi)容和底層原理推薦博文:http://blog.csdn.net/hsuxu/article/details/9467651

和 http://www.reibang.com/p/fb6e91b013cc

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

接下來,虛擬機要對對象進行必要的設(shè)置惹盼,例如這個對象是哪個類的實例庸汗、如何才能找到類的元數(shù)據(jù)信息、對象的哈希碼手报、對象的GC分代年齡等信息蚯舱。這些信息存放在對象的對象頭(Object Header)之中。根據(jù)虛擬機當前的運行狀態(tài)的不同掩蛤,如是否啟用偏向鎖等枉昏,對象頭會有不同的設(shè)置方式。關(guān)于對象頭的具體內(nèi)容揍鸟,稍后再做詳細介紹兄裂。

在上面工作都完成之后,從虛擬機的視角來看,一個新的對象已經(jīng)產(chǎn)生了晰奖,但從Java程序的視角來看谈撒,對象創(chuàng)建才剛剛開始——<init>方法還沒有執(zhí)行,所有的字段都還為零匾南。所以啃匿,一般來說(由字節(jié)碼中是否跟隨invokespecial指令所決定),執(zhí)行new指令之后會接著執(zhí)行<init>方法午衰,把對象按照程序員的意愿進行初始化立宜,這樣一個真正可用的對象才算完全產(chǎn)生出來。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末臊岸,一起剝皮案震驚了整個濱河市橙数,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌帅戒,老刑警劉巖灯帮,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逻住,居然都是意外死亡钟哥,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進店門瞎访,熙熙樓的掌柜王于貴愁眉苦臉地迎上來腻贰,“玉大人,你說我怎么就攤上這事扒秸〔パ荩” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵伴奥,是天一觀的道長写烤。 經(jīng)常有香客問我,道長拾徙,這世上最難降的妖魔是什么洲炊? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮尼啡,結(jié)果婚禮上暂衡,老公的妹妹穿的比我還像新娘。我一直安慰自己崖瞭,他們只是感情好古徒,可當我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著读恃,像睡著了一般隧膘。 火紅的嫁衣襯著肌膚如雪代态。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天疹吃,我揣著相機與錄音蹦疑,去河邊找鬼。 笑死萨驶,一個胖子當著我的面吹牛歉摧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腔呜,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼叁温,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了核畴?” 一聲冷哼從身側(cè)響起膝但,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎谤草,沒想到半個月后跟束,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡丑孩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年冀宴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片温学。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡略贮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仗岖,到底是詐尸還是另有隱情刨肃,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布箩帚,位于F島的核電站,受9級特大地震影響黄痪,放射性物質(zhì)發(fā)生泄漏紧帕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一桅打、第九天 我趴在偏房一處隱蔽的房頂上張望是嗜。 院中可真熱鬧,春花似錦挺尾、人聲如沸鹅搪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抓谴,卻和暖如春句各,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背馁筐。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坠非,地道東北人敏沉。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像炎码,于是被迫代替她去往敵國和親盟迟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,066評論 2 355

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