4

我想,ThreadLocal 变量是在 Thread Local allocation Buffer(s) 或 TLAB 中分配的,对吗?

我没有成功找到任何说明是什么使某些类存储在 TLAB 中的文档。如果您知道一些,请发布链接。

4

5 回答 5

8

我没有成功找到任何文件说明究竟是什么让某些类存储在 TLAB 中。如果您知道一些,请发布链接。

实际上,解释就在您链接到的博客文章中:

线程本地分配缓冲区 (TLAB) 是 Eden 的一个区域,用于由单个线程进行分配。它使线程能够使用线程局部顶部和限制指针进行对象分配,这比对跨线程共享的顶部指针执行原子操作要快。

每个线程都从它自己的 Eden 块(堆的“第 0 代”部分)分配内存。几乎所有东西都在 TLAB 中存储了一段时间 - 很可能ThreadLocal也是你的 s - 但在 gen0 垃圾收集后它们会从那里移走。TLAB 的存在是为了加快分配速度,而不是让其他线程无法访问内存。来自您链接到的同一个博客的更易于访问的描述是A little thread privacy, please

于 2011-02-07T09:31:27.420 回答
4

不,它是这样的:从 1.4 开始,Java 中的每个线程都有一个名为threadLocalswhere 保存映射的字段。每个 threadLocal 都有一个结构索引,因此它不使用 hashCode()。想象一个数组,每个 ThreadLocal 保持一个槽索引。

当线程终止并且不再有对它的引用时,ThreadLocals 将被 GC'd。很简单的想法。

您可以通过扩展 Thread 并添加一个字段来保存引用来实现自己的 ThraLocal(s)。然后将线程强制转换为你自己的类并获取数据。

所以它不是 TLAB,它仍然像任何其他对象一样是堆。


从历史上看,有一些带有静态 WeakHashMap 的实现,它们访问数据的速度非常慢。

于 2011-02-07T09:20:37.490 回答
2

据我了解,TLAB 用于所有中小型对象的对象分配。您的 ThreadLocal 的分配不会有任何不同。

于 2011-02-07T09:21:19.073 回答
1

我很确定这取决于 JVM 实现者的判断。如果他们愿意,他们可以将数据放入 TLAB 中,或者放入以线程 ID 为键的全局表中。Java 语言规范往往对这类问题保持沉默,以便 JVM 作者可以在尽可能多和不同的平台上部署 Java。

于 2011-02-07T09:12:06.020 回答
1

我认为只有指向它的指针,而数据本身驻留在其他一些内存区域。请参阅http://blogs.oracle.com/jonthecollector/entry/the_real_thinghttp://wikis.sun.com/display/MaxineVM/Threads#Threads-Threadlocalvariables

于 2011-02-07T09:16:39.623 回答