【问题标题】:does TLAB allocated object be shared after allocation?分配后是否共享 TLAB 分配的对象?
【发布时间】:2020-06-23 01:53:54
【问题描述】:

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

【问题讨论】:

    标签: memory-management jvm heap-memory


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 更准确地说,对象永远不会移出 TLAB。这更像是移动了​​ TLAB 边界。 TLAB 不是堆中的一个单独区域 - 它属于年轻代或 G1 区域或由所选 GC 定义的堆的任何部分。 TLAB 只是堆中的几个每个线程的指针。当一个线程分配一个新的 TLAB(即设置指向新目标的指针)时,前一个自动消失,成为常规的共享堆。
    • @apangin 你的意思是,在对象可能被复制到幸存者空间之前,它不再是 TLAB?
    • 是的。 TLAB 可以被认为是由特定线程预分配的 [shared] 堆的连续区域。一旦线程预分配了一个新的 TLAB,或者发生了 GC(以先发生者为准),之前预分配的区域就会失去与线程的连接。
    猜你喜欢
    • 2011-06-22
    • 2014-12-08
    • 1970-01-01
    • 2019-08-07
    • 2021-11-05
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多