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
区分配就涉及到了以前说到的内存分配的过程)。