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

标签 memory-management jvm heap-memory

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

最佳答案

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

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

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

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

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

关于memory-management - 分配后TLAB分配的对象是否共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60629966/

相关文章:

java - 在clojure中制作一个插件系统

hadoop - 如何在单个 JVM 中运行 hadoop 多线程方式?

java - 长时间偶然的 Young 垃圾收集暂停

c - 你应该在 C 程序结束时释放吗

objective-c - 关于autorelease/release和【池释放】

ios - 与 iOS 中的 setter/getter 相关的奇怪的 EXC_BAD_ACCESS 崩溃

java - asm 字节码中的字符串相等性

Java 拒绝启动 - 无法为对象堆保留足够的空间

c - 使用自定义堆的类似 malloc 的函数

c - C 中的重复指针资源处理