【Java虚拟机】什么是对象分配过程中的TLAB?

原创
2020/12/07 21:04
阅读数 579

1 为什么要有TLAB?

TLAB的全称是:Thread Local Allocation Buffer,翻译过来意思是线程本地缓冲内存。

  • 在内存分配过程中,堆区是线程共享的区域,任何线程都可以反问到堆区中的共享数据。
  • 由于对象的实例创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的(有可能出现多个线程同时想要同一块内存的情况)
  • 为了避免多个线程操作同一个地址,需要使用加锁等机制,进而影响分配速度。

2 什么是TLAB?

  • 从内存模型的角度来说,对Eden区继续进行划分,JVM为每个线程分配了一个私有的缓冲区域,这个区域包含在Eden空间内。
  • 多线程同时分配内存时,使用TLAB可以避免一系列的线程安全问题。同时还能够提升内存分配的吞吐量。因此我们可以将这种内存分配方式称为快速分配策略。
  • 所有的OpenJDK衍生出来的JVM都提供了TLAB的设计。

3 其他说明

  • 尽管不是所有的对象实例都能够在TLAB中成功分配,单JVM确实将TLAB作为内存分配的首选。(因为线程缓冲区域很小,大对象无法容纳)
  • 在程序中,开发人员可以通过首选项:“-XX:UseTLAB”设置是否开启TBLAB空间。
  • 默认情况下,TLAB的空间的内存非常小,仅占有整个Eden空间的1%,当然我们可以通过首选项“-XXTLABWasteTargetPercent”设置TLAB空间所占Eden空间的百分比大小。
  • 一旦对象在TLAB空间内存分配失败时,JVM机会尝试通过使用加锁机制确保数据操作的原子性,从而直接在Eden空间分配内存。

4 对象分配过程示意图

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部