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

问题描述 投票:1回答:1

在JVM Eden空间中TLAB的设计使我感到困惑。我的问题是,如果对象是由TLAB中的一个线程分配的,那么以后如何与其他线程共享呢?将重新组装专用于一个线程的TLAB区域,还是将对象移出?

memory-management jvm heap-memory
1个回答
4
投票

TLAB是专门为一个线程生成的分配保留的。它仍然在所有线程的相同共享地址空间中存储。换句话说,所有线程都可以访问

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

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

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

[以前用作垃圾回收器的内存区域已被垃圾回收器清空后,它也可能作为新的垃圾回收器重新分配给其他线程(或用于其他用途)。

© www.soinside.com 2019 - 2024. All rights reserved.