Bootstrap

【jvm】什么是TLAB

1. 说明
  • 1.TLAB即Thread Local Allocation Buffer,是Java虚拟机中的一种内存区域,全称为线程本地分配缓存区。
  • 2.是JVM为每个线程分配的一个私有的、固定大小的内存区域。
  • 3.用于存储线程私有的对象实例和本地数据。
  • 4.TLAB的主要目的是提高对象分配的性能,减少线程之间的竞争,以及降低内存分配的开销。
2. TLAB的作用
2.1 提高对象分配性能
  • 1.在传统的JVM内存分配方式中,多个线程在分配对象时需要竞争同一个全局的分配锁,会导致性能瓶颈。
  • 2.TLAB则为每个线程分配一个私有的内存区域,使得线程在分配对象时不再需要竞争全局锁,而是在自己的TLAB中进行分配,提高了对象分配的效率。
2.2 减少线程竞争
  • 1.由于TLAB是线程私有的,因此多个线程在分配对象时不会互相干扰,减少了线程之间的竞争,提高了系统的并发性能。
2.3 降低内存分配开销
  • 1.使用TLAB可以减少全局分配锁的开销,因为线程在TLAB中分配对象时不需要获取全局锁。
  • 2.由于TLAB的大小是固定的,因此JVM可以更高效地管理内存,降低了内存分配的开销。
3. TLAB的生命周期
3.1 创建与初始化
  • 1.当线程被创建时,如果JVM启动了TLAB(默认是开启的),则会为该线程创建并初始化TLAB。
  • 2.在GC扫描对象后,线程第一次尝试分配对象时,也会创建并初始化TLAB。
3.2 使用与再填充
  • 1.线程在分配对象时,会优先在自己的TLAB中进行分配。
  • 2.当TLAB被用完或接近于满时,线程会尝试再填充TLAB,即从堆中申请新的内存空间来扩展TLAB。
  • 3.如果无法再填充(例如堆内存不足),则线程会竞争全局分配锁,在堆中直接分配对象。
3.3 释放与回收
  • 1.在GC扫描对象时,TLAB会释放回Eden区。
  • 2.TLAB的生命周期期望只存在于一个GC扫描周期内。
  • 3.如果TLAB中的对象在GC过程中仍然存活,它们会被复制到其他内存区域(如Survivor幸存者区或老年代),而TLAB本身则会被回收。
4. TLAB的配置与优化
  • 1.启用与禁用TLAB:可以通过JVM参数 -XX:+UseTLAB 来启用TLAB,通过 -XX:-UseTLAB 来禁用TLAB。默认情况下,JVM是启用TLAB的。
  • 2.设置TLAB大小:可以通过JVM参数 -XX:TLABSize= 来设置TLAB的初始大小(以字节为单位)。如果没有指定TLAB大小,JVM会根据堆大小、线程数量等因素动态计算TLAB的大小。
  • 3.调整TLAB相关参数:JVM还提供了其他与TLAB相关的参数,如 -XX:MinTLABSize= (设置最小TLAB大小)、
    -XX:TLABWasteTargetPercent=(设置TLAB浪费占用Eden的百分比)等,这些参数可以帮助用户进一步优化TLAB的性能。
;