【发布时间】:2020-06-23 01:53:54
【问题描述】:
JVM Eden 空间中的 TLAB 设计让我有些困惑。我的问题是,如果对象是由 TLAB 中的一个线程分配的,那么它之后如何与其他线程共享?一个线程专有的TLAB区域会被重新组装,还是对象被移出?
【问题讨论】:
标签: memory-management jvm heap-memory
JVM Eden 空间中的 TLAB 设计让我有些困惑。我的问题是,如果对象是由 TLAB 中的一个线程分配的,那么它之后如何与其他线程共享?一个线程专有的TLAB区域会被重新组装,还是对象被移出?
【问题讨论】:
标签: memory-management jvm heap-memory
TLAB 专为由一个线程进行的分配保留。它仍然是所有线程的同一共享地址空间中的内存。换句话说,它可以被所有线程访问。
当然,如果您将对象的引用存储到共享变量中,则对象只能被其他线程访问。由于在正常工作的 JVM 中,其他线程只能通过遍历此类引用来访问内存,这意味着其他线程只能访问已由所有者为对象分配的 TLAB 的内存,并且至少最小初始化在引用变为可观察之前,由 JMM 保证的工作已由所有者线程完成。
这种内在的正确性意味着其他线程不需要看到 TLAB 的实际分配状态,因此维护信息可以真正是线程本地的,例如保存在 CPU 寄存器中。
不管一个对象是否被多个线程共享,它只会从它的初始分配中移除,如果它存活到下一次垃圾回收(如果正在使用复制收集器)。但是到这种情况发生时,对象被分配到的内存不再是 TLAB,因为使该内存成为 TLAB 的原因是它的使用方式。
在以前用作 TLAB 的内存区域被垃圾收集器清空后,它也可能作为新的 TLAB 重新分配给不同的线程(或用于不同的目的)。
【讨论】: