是否在TLAB中分配了ThreadLocal?

时间:2011-02-07 09:08:17

标签: java performance memory-management thread-local

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

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

5 个答案:

答案 0 :(得分:7)

  

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

实际上,你在博客文章中的解释是正确的:

  

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

每个线程都从自己的Eden块中分配内存,这是堆的“Generation 0”部分。几乎所有东西都存储在TLAB中一段时间​​ - 很可能也是你的ThreadLocal - 但是在gen0垃圾收集之后它们会从那里移开。 TLAB可以更快地进行分配,而不是让其他线程无法访问内存。您链接到的同一博客中的更易于访问的说明是A little thread privacy, please

答案 1 :(得分:2)

没有。它是这样的: 从1.4开始,Java中的每个线程都有一个名为threadLocals的字段,其中保存了映射。每个threadLocal都有一个结构索引,所以它不使用hashCode()。想象一个数组,每个ThreadLocal都保留一个插槽索引。

当线程死亡时,没有更多的引用,ThreadLocals是GC'd。很简单的想法。

您可以通过扩展Thread并添加一个字段来保存引用来实现您自己的ThreaLocal。然后将Thread转换为您自己的类并获取数据。

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


历史上,有静态WeakHashMap的实现,访问数据的速度非常慢。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我很确定这取决于JVM实施者的判断。如果需要,他们可以将数据放在TLAB中,或者在由线程ID键入的全局表中。 Java语言规范倾向于对这些问题保持沉默,以便JVM作者可以在尽可能多的平台上部署Java。

答案 4 :(得分:1)

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