分配后TLAB分配的对象是否共享?

does TLAB allocated object be shared after allocation?

JVM Eden 中 TLAB 的设计 space 让我有点困惑。我的问题是,如果对象是由 TLAB 中的一个线程分配的,那么之后如何与其他线程共享?一个线程独占的TLAB区是重新组装,还是对象被移出?

一个 TLAB 专门为一个线程进行的分配保留。它仍然是所有线程的相同共享地址 space 内的内存。换句话说,它可以被所有线程访问

当然,如果将对象的引用存储到共享变量中,则对象只能由其他线程访问。由于在正常工作的 JVM 中,其他线程只能通过遍历这样的引用来访问内存,这意味着其他线程只能访问所有者已经为对象分配的 TLAB 的内存,并且至少进行了最小初始化JMM 保证的工作在引用变为可观察之前已由所有者线程完成。

这种内在的正确性意味着其他线程不需要看到 TLAB 的实际分配状态,因此维护信息可以是真正的线程本地的,例如保存在 CPU 个寄存器中。

无论一个对象是否被多个线程共享,如果它在下一次垃圾收集之前仍然存在(如果正在使用复制收集器),它只会从其初始分配中移走。但是当发生这种情况时,分配对象的内存不再是 TLAB,因为使该内存成为 TLAB 的是它的使用方式。

在以前用作 TLAB 的内存区域被垃圾收集器清空后,它也可能作为新的 TLAB 重新分配给不同的线程(或用于不同的目的)。