JVM對象分配之棧上分配 & TLAB分配

Java對象分配流程

image

棧上分配技術:

是java虛擬機提供的一項優(yōu)化技術,它的基本思想是,對于那些線程私有對象(指不可能被其他線程訪問的對象)可以將它們打散分配在棧上鹰溜,而不是分配在堆上序芦。

好處: 分配在棧上可以結束后自行銷毀,不需要垃圾回收器介入蔬咬,從而提高系統(tǒng)的性能鲤遥。

局限性: 棧空間小林艘,對于大對象無法實現(xiàn)棧上分配盖奈。

基礎:棧上分配依賴于逃逸分析和標量替換。

逃逸分析:

棧上分配的一個技術基礎是進行逃逸分析北启。目的是判斷對象的作用域是否有可能逃逸出逃逸體卜朗。

虛擬機會進行逃逸分析,判斷線程內(nèi)私有對象是否有可能被其他線程訪問咕村,導致逃逸场钉,然后虛擬機就會根據(jù)是否可能會逃逸將其分配在棧上,或者堆中懈涛。

只有在server模式下逛万,才能開啟逃逸分析。
如下示例:


image

參數(shù):
-XX:+DoEscapeAnalysis 是開啟逃逸分析。
-XX:+EliminateAllocations 是開啟標桿替換宇植,允許將對象打散分配到棧上得封,默認就是打開的。

代碼:

//user的作用域超出了函數(shù)setUser的范圍,是逃逸對象
//當函數(shù)結束調(diào)用時指郁,不會自行銷毀user
private User user;
public void setUser(){
   user = new User();
   user.setId(1);
   user.setName("blueStarWei");
}

//u只在函數(shù)內(nèi)部生效忙上,不是逃逸對象
//當函數(shù)調(diào)用結束,會自行銷毀對象u
public void createUser(){
   User u = new User();
   u.setId(2);
   u.setName("JVM");
}

棧上示例分配:<來自實戰(zhàn)java虛擬機>

public class AllotOnStack {

   public static class{
       public int id=0;
       public String name="";
   }

   public static void main(String[] args) {
       long start = System.currentTimeMillis();
       for (int i = 0; i < 100000000; i++) {
           alloc();
       }
       long end = System.currentTimeMillis();
       System.out.println(end - start);
   }

   private static void alloc() {
       User user = new User();
       user.setId(1);
       user.setName("zengxinyao");
   }
}

上述代碼調(diào)用了1億次alloc()闲坎,如果是分配到堆上疫粥,大概需要1.5GB的堆空間,如果堆空間小于該值腰懂,必然會觸發(fā)GC梗逮。

使用如下參數(shù)運行,發(fā)現(xiàn)不會觸發(fā)GC

-server -Xmx15m -Xms15m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations

使用如下參數(shù)(任意一行)運行绣溜,會發(fā)現(xiàn)觸大量GC

//不使用逃逸分析
-server -Xmx15m -Xms15m -XX:-DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:+EliminateAllocations

//不使用標量替換
-server -Xmx15m -Xms15m -XX:+DoEscapeAnalysis -XX:+PrintGC -XX:-UseTLAB -XX:-EliminateAllocations

可以得出:
棧上分配依賴于逃逸分析和標量替換

JVM參數(shù)解析

image

TLAB 分配

TLAB慷彤,全稱Thread Local Allocation Buffer,即:線程本地分配緩存。這是一塊線程專用的內(nèi)存分配區(qū)域怖喻。TLAB占用的是eden區(qū)的空間底哗。在TLAB啟用的情況下(默認開啟),JVM會為每一個線程分配一塊TLAB區(qū)域罢防。

為什么需要TLAB艘虎?

這是為了加速對象的分配。由于對象一般分配在堆上咒吐,而堆是線程共用的野建,因此可能會有多個線程在堆上申請空間,而每一次的對象分配都必須線程同步恬叹,會使分配的效率下降候生。考慮到對象分配幾乎是Java中最常用的操作绽昼,因此JVM使用了TLAB這樣的線程專有區(qū)域來避免多線程沖突唯鸭,提高對象分配的效率

局限性:TLAB空間一般不會太大(占用eden區(qū)),所以大對象無法進行TLAB分配硅确,只能直接分配到堆上.

分配策略:

一個100KB的TLAB區(qū)域目溉,如果已經(jīng)使用了80KB,當需要分配一個30KB的對象時菱农,TLAB是如何分配的呢缭付?

此時,虛擬機有兩種選擇:第一循未,廢棄當前的TLAB(會浪費20KB的空3.4 間)嘲叔;第二最仑,將這個30KB的對象直接分配到堆上姨拥,保留當前TLAB(當有小于20KB的對象請求TLAB分配時可以直接使用該TLAB區(qū)域)。

JVM選擇的策略是:在虛擬機內(nèi)部維護一個叫refill_waste的值足陨,當請求對象大于refill_waste時,會選擇在堆中分配娇未,反之墨缘,則會廢棄當前TLAB,新建TLAB來分配新對象忘蟹。

【默認情況下飒房,TLAB和refill_waste都是會在運行時不斷調(diào)整的,使系統(tǒng)的運行狀態(tài)達到最優(yōu)媚值。
  
  


image

取自:
《實戰(zhàn)Java虛擬機 - JVM故障診斷與性能優(yōu)化》
棧上分配、TLAB : https://blog.csdn.net/yangsnow_rain_wind/article/details/80434323

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末护糖,一起剝皮案震驚了整個濱河市褥芒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫡良,老刑警劉巖锰扶,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寝受,居然都是意外死亡坷牛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門很澄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來京闰,“玉大人,你說我怎么就攤上這事甩苛□彘梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵讯蒲,是天一觀的道長痊土。 經(jīng)常有香客問我,道長墨林,這世上最難降的妖魔是什么赁酝? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮旭等,結果婚禮上酌呆,老公的妹妹穿的比我還像新娘。我一直安慰自己辆雾,他們只是感情好肪笋,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般藤乙。 火紅的嫁衣襯著肌膚如雪猜揪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天坛梁,我揣著相機與錄音而姐,去河邊找鬼。 笑死划咐,一個胖子當著我的面吹牛拴念,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褐缠,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼政鼠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了队魏?” 一聲冷哼從身側響起公般,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胡桨,沒想到半個月后官帘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡昧谊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年刽虹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呢诬。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡涌哲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出馅巷,到底是詐尸還是另有隱情膛虫,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布钓猬,位于F島的核電站稍刀,受9級特大地震影響,放射性物質發(fā)生泄漏敞曹。R本人自食惡果不足惜账月,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望澳迫。 院中可真熱鬧局齿,春花似錦、人聲如沸橄登。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谣妻,卻和暖如春萄喳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蹋半。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工他巨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人减江。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓染突,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辈灼。 傳聞我的和親對象是個殘疾皇子份企,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 我們在學習使用Java的過程中,一般認為new出來的對象都是被分配在堆上茵休,但是這個結論不是那么的絕對薪棒,通過對Jav...
    新時代農(nóng)民工閱讀 372評論 0 1
  • 特點 Java 堆(Java Heap)是 Java 虛擬機所管理的內(nèi)存中最大的一塊,也被稱為 “GC堆”榕莺,是被所...
    _曉__閱讀 2,633評論 2 9
  • 概述 對于逃逸分析和TLAB兩種技術之間的關聯(lián)一直沒有理清楚,今天抽時間專門整理了一下這兩門技術棵介。通過這篇文章钉鸯,我...
    heyong閱讀 3,395評論 1 15
  • TLAB整理 HotSpot VM在JAVA堆中對象創(chuàng)建,布局,訪問全過程(僅限于普通java對象,不包括數(shù)組和C...
    andersonoy閱讀 3,028評論 0 2
  • 前言 記錄個人在2017年08月的學習和總結,不定期更新 2017-08-02 有序的Map HashMap是無序...
    Kevin_ZGJ閱讀 398評論 0 0