在hotspot vm中,有兩個(gè)方式來(lái)提升申請(qǐng)內(nèi)存空間的速度,分別是bumo the pointer 突出指針“以及”TLABS(Thread-Local Allocation Buffers)“
BTP總是指向最后創(chuàng)建的對(duì)象地址,這樣當(dāng)有新的對(duì)象需要?jiǎng)?chuàng)建的時(shí)候,只需要計(jì)算總的和最后一個(gè)就能得出可用空間,如果足夠,則申請(qǐng)空間,并且移動(dòng)BTP
對(duì)象內(nèi)存的創(chuàng)建在單線程下比較簡(jiǎn)單,但是在多線程環(huán)境下,需要線程安全的操作,那就必須使用鎖,這樣在高并發(fā)下,性能就會(huì)有巨大的下降,TLAB就是為了解決這種情況,他為每個(gè)線程劃分一段較小的空間,這樣在整個(gè)堆上就不會(huì)有沖突,并且也不必使用同步或者某些原子操作來(lái)保證線程安全。這種模式下每個(gè)tlab區(qū)的大小,主要受限于幾個(gè)參數(shù):線程數(shù),申請(qǐng)空間的頻率,堆大小,在java7中,為了考慮這些因?yàn)椋?/font>tlab部分已經(jīng)有幾千行的代碼,及其復(fù)雜
每個(gè)區(qū)太大,或者線程數(shù)太多,都會(huì)使得產(chǎn)生過(guò)多的碎片,這回導(dǎo)致更多的gc產(chǎn)生,實(shí)際上還是影響性能,現(xiàn)在有一種分層分配緩存(hierarchical allocation buffers),可以參考
TLAB類(lèi)似于2層的結(jié)構(gòu),即heap和tlabs,在HAB中,分為了4(3)層,heap,process,core,thread
PLAB是為多核處理器準(zhǔn)備的,線程跑在不同核,但是相同處理器的情況下,共享PLAB;CLAB是給核分配的,在相同核上的線程共享CLAB;PLAB和CLAB都應(yīng)該是TLAB的整數(shù)倍,來(lái)避免碎片;訪問(wèn)流程如下:根據(jù)線程當(dāng)前所在的處理器以及核,在這個(gè)PLAB以及CLAB下申請(qǐng)空間
這種方式明顯的好處就是可以線程的多少不會(huì)有太多的影響,也不用考慮太多的TLAB的大小,一般申請(qǐng)較大的PLAB和CLAB,較小的TLAB即可
Hierarchical PLABs, CLABs, TLABs in Hotspot
因?yàn)?/span>TLAB的方式受到線程數(shù)的限制,過(guò)小會(huì)降低效率,過(guò)大容易造成浪費(fèi);按照分層的設(shè)計(jì)模型,分為處理器(process),核(core),線程(Thread)的方式劃分空間,這種方式不受限于線程數(shù),一般只要分配較大的PLAB,CLAB,以及較小的TLAB即可
聯(lián)系客服