我想,ThreadLocal 变量是在 Thread Local allocation Buffer(s) 或 TLAB 中分配的,对吗?
我没有成功找到任何说明是什么使某些类存储在 TLAB 中的文档。如果您知道一些,请发布链接。
我想,ThreadLocal 变量是在 Thread Local allocation Buffer(s) 或 TLAB 中分配的,对吗?
我没有成功找到任何说明是什么使某些类存储在 TLAB 中的文档。如果您知道一些,请发布链接。
我没有成功找到任何文件说明究竟是什么让某些类存储在 TLAB 中。如果您知道一些,请发布链接。
实际上,解释就在您链接到的博客文章中:
线程本地分配缓冲区 (TLAB) 是 Eden 的一个区域,用于由单个线程进行分配。它使线程能够使用线程局部顶部和限制指针进行对象分配,这比对跨线程共享的顶部指针执行原子操作要快。
每个线程都从它自己的 Eden 块(堆的“第 0 代”部分)分配内存。几乎所有东西都在 TLAB 中存储了一段时间 - 很可能ThreadLocal
也是你的 s - 但在 gen0 垃圾收集后它们会从那里移走。TLAB 的存在是为了加快分配速度,而不是让其他线程无法访问内存。来自您链接到的同一个博客的更易于访问的描述是A little thread privacy, please。
不,它是这样的:从 1.4 开始,Java 中的每个线程都有一个名为threadLocals
where 保存映射的字段。每个 threadLocal 都有一个结构索引,因此它不使用 hashCode()。想象一个数组,每个 ThreadLocal 保持一个槽索引。
当线程终止并且不再有对它的引用时,ThreadLocals 将被 GC'd。很简单的想法。
您可以通过扩展 Thread 并添加一个字段来保存引用来实现自己的 ThraLocal(s)。然后将线程强制转换为你自己的类并获取数据。
所以它不是 TLAB,它仍然像任何其他对象一样是堆。
从历史上看,有一些带有静态 WeakHashMap 的实现,它们访问数据的速度非常慢。
据我了解,TLAB 用于所有中小型对象的对象分配。您的 ThreadLocal 的分配不会有任何不同。
我很确定这取决于 JVM 实现者的判断。如果他们愿意,他们可以将数据放入 TLAB 中,或者放入以线程 ID 为键的全局表中。Java 语言规范往往对这类问题保持沉默,以便 JVM 作者可以在尽可能多和不同的平台上部署 Java。
我认为只有指向它的指针,而数据本身驻留在其他一些内存区域。请参阅http://blogs.oracle.com/jonthecollector/entry/the_real_thing和http://wikis.sun.com/display/MaxineVM/Threads#Threads-Threadlocalvariables