其他分享
首页 > 其他分享> > 7 Tlab(个人理解,若有不足,敬请指出)

7 Tlab(个人理解,若有不足,敬请指出)

作者:互联网

Java对象在完成正确的堆内存空间分配时采用二种方式:一种是cas失败重试,另一种是Tlab。tlab是线程本地分配内存的英语缩写,从语义可知是一个线程专用的内存分配区域,他也存在堆中,但是也独立于堆中空间。

我们在为一个对象在堆中分配空间时,也有其他线程在为对象在堆内存分配空间,于是就存在空间的竞争,在激烈的竞争场合内存分配的效率比较低下,所以考虑以上的情况出现,我们采用TLAB线程专属空间避免多线程冲突,提高分配效率。TlAB也是占用堆内存的esdn空间的,在启用Tlab情况下(默认开启)虚拟机会为每个线程创建一个分配Tlab空间的。TLAB只是让每个线程有私有的分配指针,但底下存对象的内存空间还是给所有线程访问的,只是其它线程无法在这个区域分配而已。

TLAB空间一般是不会太大,则较大对象肯定无法在此分配,正是TlAB空间的局限性,对象可能很容易将此空间装满。如一个线程,他有100k的TLAB空间,现在已存入对象占用了80k,现在有个30k的对象肯定无法满足对空间的需求,所以它存在二种解决方式:第一种就是放弃当前的TLAB空间,把他还给堆空间,创建新的TLAB。第二种就是让这个30k的对象在堆空间分配,保留TLAB空间,或许后面会有小于等于20k的对象。

为了解决以上的情况,虚拟机维护了一个refill-waste的值,他表示TLAB允许内存浪费的空间。默认是tlab空间的1/64(在运行时可能会自动调整达到最优化)。当新的对象请求时空间内存已不足时,会让当前对象所需占用的空间内存和refill-waste比较,若大于rw会在堆中分配,保留tlab;小于rw会废弃当前Tlab空间新建一个分配对象。当然这些鬼东西都是可以手动调节,具体参数网上找。

其实对象的大致分配流程:

第一:尝试栈上分配,如不成功第二步。

第二:尝试tlab分配,如不成功第三步。

第三:是否满足老年代分配,如不成功第四步。

第四:edsn分配。

标签:若有,对象,内存,敬请,线程,Tlab,空间,分配,TLAB
来源: https://blog.csdn.net/weixin_38287519/article/details/99087002