JVM編譯器優(yōu)化(1)

JVM對象分配

棧上分配

1. 出現(xiàn)原因

Java堆中內(nèi)存是線程共享的催首,假設(shè)所有對象都從堆中分配的話,所有回收對象的篩選泄鹏、整理郎任、清除都需要耗費(fèi)大量的資源,十分不合理备籽,那么對象分配在棧幀中舶治,隨棧而生,那么GC回收的所耗費(fèi)的資源就可以省略车猬,大大提高JVM的效率霉猛。

2. 技術(shù)支持

逃逸分析:在編程語言的編譯優(yōu)化原理中,分析指針動態(tài)范圍的方法稱之為逃逸分析珠闰。它跟靜態(tài)代碼分析技術(shù)中的指針分析和外形分析類似韩脏。通俗一點講,當(dāng)一個對象的指針被多個方法或線程引用時铸磅,我們稱這個指針發(fā)生了逃逸。

方法逃逸:例如調(diào)用參數(shù)傳遞到其他方法中杭朱。

線程逃逸:當(dāng)前線程對象被其他線程訪問阅仔。

總結(jié):假設(shè)對象沒有逃逸,那么允許將對象打散分配在棧上弧械。JVM允許將線程私有的對象打散分配在棧上八酒,而不是分配在堆上。分配在棧上的好處是可以在函數(shù)調(diào)用結(jié)束后自行銷毀刃唐,而不需要垃圾回收器的介入羞迷,從而提高系統(tǒng)性能。

TLAB分配

TLAB全稱是Thread Local Allocation Buffer画饥,即線程本地分配緩存區(qū)衔瓮。由于對象一般分配在堆內(nèi)存中,堆是線程共享的抖甘,每次對象分配都會進(jìn)行線程同步热鞍,在多線程情況下同步操作是會讓分配效率大大降低。JVM使用TLAB來避免線程間的沖突,從而提高分配效率薇宠。

TLAB本身占用Eden空間偷办,在開啟TLAB的情況下,JVM會為每條線程分配一塊TLAB的空間澄港。參數(shù)-XX:+TLAB開啟TLAB椒涯,默認(rèn)開啟。TLAB內(nèi)存占用非常小回梧,默認(rèn)是Eden的1%废岂,也可以使用-XX:TLABWasteTargetPercent設(shè)置TLAB空間所占用Eden的百分比大小。

由于TLAB空間一般不會很大漂辐,因此大對象無法在TLAB中進(jìn)行分配泪喊,總是會直接分配在堆內(nèi)存中。TLAB空間由于比較小髓涯,因此很容易裝滿袒啼。比如,一個100K的空間纬纪,已經(jīng)使用了80KB蚓再,當(dāng)需要再分配一個30KB的對象時,肯定就無能為力了包各。這時虛擬機(jī)會有兩種選擇摘仅,第一,廢棄當(dāng)前TLAB问畅,這樣就會浪費(fèi)20KB空間娃属;第二,將這30KB的對象直接分配在堆上护姆,保留當(dāng)前的TLAB矾端,這樣可以希望將來有小于20KB的對象分配請求可以直接使用這塊空間。實際上虛擬機(jī)內(nèi)部會維護(hù)一個叫作refill_waste的值卵皂,當(dāng)請求對象大于refill_waste時秩铆,會選擇在堆中分配,若小于該值灯变,則會廢棄當(dāng)前TLAB殴玛,新建TLAB來分配對象。這個閾值可以使用TLABRefillWasteFraction來調(diào)整添祸,它表示TLAB中允許產(chǎn)生這種浪費(fèi)的比例滚粟。默認(rèn)值為64,即表示使用約為1/64的TLAB空間作為refill_waste刃泌。默認(rèn)情況下坦刀,TLAB和refill_waste都會在運(yùn)行時不斷調(diào)整的愧沟,使系統(tǒng)的運(yùn)行狀態(tài)達(dá)到最優(yōu)。如果想要禁用自動調(diào)整TLAB的大小鲤遥,可以使用-XX:-ResizeTLAB禁用ResizeTLAB沐寺,并使用-XX:TLABSize手工指定一個TLAB的大小。

-XX:+PrintTLAB可以跟蹤TLAB的使用情況盖奈。一般不建議手工修改TLAB相關(guān)參數(shù)混坞,推薦使用虛擬機(jī)默認(rèn)行為。

內(nèi)存分配

為對象分配空間的任務(wù)等同于把一塊確定大小的內(nèi)存從Java堆中劃分出來钢坦,有兩種方法究孕。

指針碰撞

內(nèi)存的使用與未使用由指針作為分界線,指導(dǎo)指針與內(nèi)存最大值地址重合則內(nèi)存分配完成爹凹。針對規(guī)整的內(nèi)存分配厨诸,適用于復(fù)制算法和標(biāo)記整理算法的GC收集器,例如Serial禾酱、ParNew微酬、Parallel、G1颤陶。

空閑列表

JVM維護(hù)一個列表颗管,記錄內(nèi)存的使用情況,根據(jù)對象的大小分配內(nèi)存滓走,并更新列表垦江。針對不規(guī)整的內(nèi)存分配,適用于標(biāo)記清除算法的GC收集器搅方,例如CMS比吭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姨涡,隨后出現(xiàn)的幾起案子衩藤,更是在濱河造成了極大的恐慌,老刑警劉巖绣溜,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娄蔼,居然都是意外死亡怖喻,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門岁诉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锚沸,“玉大人,你說我怎么就攤上這事涕癣』冢” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長距潘。 經(jīng)常有香客問我炼列,道長,這世上最難降的妖魔是什么音比? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任俭尖,我火速辦了婚禮,結(jié)果婚禮上洞翩,老公的妹妹穿的比我還像新娘稽犁。我一直安慰自己,他們只是感情好骚亿,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布已亥。 她就那樣靜靜地躺著,像睡著了一般来屠。 火紅的嫁衣襯著肌膚如雪虑椎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天的妖,我揣著相機(jī)與錄音绣檬,去河邊找鬼。 笑死嫂粟,一個胖子當(dāng)著我的面吹牛娇未,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播星虹,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼零抬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宽涌?” 一聲冷哼從身側(cè)響起平夜,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卸亮,沒想到半個月后忽妒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡兼贸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年段直,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(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
  • 我被黑心中介騙來泰國打工梨睁, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娜饵。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓坡贺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箱舞。 傳聞我的和親對象是個殘疾皇子遍坟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355