在多线程情况下,内存分配时,JVM可能采用CAS配合失败重试
、本地线程分配缓冲(TLAB)
等机制来保证更新操作的原子性,防止多个线程同时分配内存造成的数据冲突。
本地线程分配缓冲(TLAB)
本地线程分配缓冲(Thread Local Allocation Buffer,TLAB)是每个线程私有的内存分配区域
。每个线程可以在自己的 TLAB 上快速分配内存,减少了与其他线程的竞争。
TLAB 位于 Java 堆中,是堆内存的一部分,但每个线程对其有独立的访问权。
配置和使用:
- 开启/关闭 TLAB:可以通过 JVM 启动参数
-XX:+UseTLAB
或-XX:-UseTLAB
来启用或禁用 TLAB。默认情况下,大多数现代 JVM 都会启用 TLAB。 - TLAB 大小:TLAB 的大小可以通过
-XX:TLABSize
参数进行配置。如果未显式设置,JVM 会根据具体情况自动决定每个 TLAB 的大小。
工作原理:
- 内存分配:当一个线程尝试创建新对象时,它首先检查自己的 TLAB 是否有足够的空间进行分配。如果有足够空间,对象就在 TLAB 上快速分配。
- TLAB 用尽:当 TLAB 空间不足以分配新对象时,线程可能会请求一个新的 TLAB。这涉及到与堆上其余部分的同步,可能稍微影响性能。
- TLAB 重新填充:一旦一个线程的 TLAB 用尽,JVM 将分配一个新的 TLAB 给该线程,旧的 TLAB 中剩余的空间将在未来的垃圾回收中被视为垃圾。
CAS
当JVM配置为不使用TLAB,或者一个对象太大无法在现有TLAB中分配时,对象将直接在堆上分配。这个过程涉及CAS操作,以确保线程安全地更新堆的全局分配指针。