35.堆空间中为每个线程分配的TLAB

 

1.为什么要有TLAB(Thread Local Allocation Buffer)

1.堆区是线程共享的,任何线程都可以访问堆区中的共享数据
2.并发环境下,从堆区中划分内存空间是线程不安全的
3.为避免多个线程操作同一个地址,需要使用加锁机制,进而影响分配速度
在这里插入图片描述

2.什么是TLAB?

4.为了解决上面的问题,JVM为每个线程分配了一个私有缓存区域,它包含在Eden
5.多线程同时分配内存时,使用TLAB可以避免一系列的线程安全问题,同时还能够提升内存分配的吞吐量
在这里插入图片描述
如下图所示:每一个线程都有一个TLAB区域,包含在Eden区。
在这里插入图片描述

3.TLAB的设置

6.不是所有的对象实例都能够在TLAB中分配内存。但是JVM是将TLAB作为内存分配的首选。
7.可以使用"-XX:UseTLAB“设置开启TLAB空间。默认是开启的。
8.TLAB空间的内存空间非常小,仅占整个Eden空间的1%。可以使用”-XX:TLABWasteTargetPercent"设置TLAB占用Eden空间的百分比
在这里插入图片描述

4. TLAB分配过程

当创建一个对象的时候,会先将对应的类的字节码文件加载到内存中,然后首先会在TLAB区域分配对象,如果分配成功,则进行对象的实例化(比如说设置对象中的一些字段的值);如果TLAB分配失败(TLAB总的空间放不下这个对象,或者TLAB剩余的空间放不下这个对象),会尝试去Eden区分配(Eden区分配就涉及到了以前说到的内存分配的过程)。
在这里插入图片描述

在这里插入图片描述

posted @ 2020-11-18 15:49  跃小云  阅读(106)  评论(0编辑  收藏  举报