jvm堆中的TLAB 真的不共享吗?

1 个回答

  • 小王子-B965
    做好自己,至于别人,分交情,看心情。
    ## 1. 什么是 TLAB * **TLAB(Thread Local Allocation Buffer)** 是 **JVM 堆的 Eden 区** 给每个线程分配的一小块私有缓冲区。 * 作用:减少多线程同时在 Eden 区分配对象时的锁竞争(分配走 CAS 甚至加锁很慢)。 * 线程在自己的 TLAB 里分配对象**是无锁的**,只需更新一个指针。 ## 2. “不共享”是指 **分配阶段私有** * TLAB 是“线程私有”的,意味着**只有持有它的线程才能往里面分配对象**,其他线程不能从你的 TLAB 里分配。 * 这个“不共享”是**分配权限上的私有**: * 线程 A 不能用线程 B 的 TLAB 分配对象。 * 这样避免了多线程抢 Eden 空间指针带来的同步开销。 ## 3. 对象存活后,还是在共享堆中 * 虽然 TLAB 是在 Eden 区的一小块空间,但 **Eden 区本质上是 Java 堆的一部分**。 * Java 堆是**所有线程共享的**,所以: * 对象一旦分配出来,就有了一个地址(引用)。 * 任何线程只要拿到这个引用,就能访问这个对象(读写字段等),**不会因为它是在谁的 TLAB 中分配的就限制访问**。 * 所以,“不共享”只存在于**分配阶段**,对象生命周期中并不会被“绑定”在创建它的线程上。 ## 4. 举个例子 ```java class Obj { int x; } Obj o; void threadA() { o = new Obj(); // 在A线程的TLAB里分配 } void threadB() { System.out.println(o.x); // B线程直接访问这个对象,没有限制 } ``` * `new Obj()` 发生在 **A 的 TLAB**,分配时是私有、无锁的。 * 但 `o` 引用被共享给了 B,B 访问它时不需要关心它是在哪个 TLAB 分配的,因为这个对象仍在 Eden 区(共享堆)。 ## 5. 为什么要这样设计 * 分配阶段的私有性 → 提高分配速度(避免竞争)。 * 存活期的共享性 → 保持 Java 内存模型语义(堆是所有线程共享的)。 **一句话总结** TLAB 的“不共享”只是在**分配权限**上不共享;对象一旦分配好,它就属于共享堆中的一员,任何线程都可以通过引用访问它。
    发布于 2025-08-05 09:43 •IP属地 香港
    举报
    评论
    收藏