JVM精进之路

JVM相关问题一网打尽
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

JVM如何保证创建对象线程安全?

发布于 2024-08-30 | 更新于 2024-08-30

在多线程情况下,内存分配时,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 的大小。

工作原理

  1. 内存分配:当一个线程尝试创建新对象时,它首先检查自己的 TLAB 是否有足够的空间进行分配。如果有足够空间,对象就在 TLAB 上快速分配。
  2. TLAB 用尽:当 TLAB 空间不足以分配新对象时,线程可能会请求一个新的 TLAB。这涉及到与堆上其余部分的同步,可能稍微影响性能。
  3. TLAB 重新填充:一旦一个线程的 TLAB 用尽,JVM 将分配一个新的 TLAB 给该线程,旧的 TLAB 中剩余的空间将在未来的垃圾回收中被视为垃圾。

CAS

当JVM配置为不使用TLAB,或者一个对象太大无法在现有TLAB中分配时,对象将直接在堆上分配。这个过程涉及CAS操作,以确保线程安全地更新堆的全局分配指针。

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/faqs/jvm/memory-management/how-jvm-ensures-thread-safety-when-creating-objects.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。