什么是TLAB(线程本地分配缓冲区)?

use*_*356 29 java garbage-collection java-memory-model

我找不到一个能够以清晰的方式解释这个概念的综合资料来源.我的理解是,在eden中为线程分配了一些新的对象.一个竞争的线程最终会有一些连续的伊甸园.如果第一个线程在其TLAB中用完了空闲区域会发生什么?它会要求新的伊甸园吗?

Raf*_*ter 36

TLAB的想法是减少线程之间同步的需要.使用TLAB,这种需求减少了,因为任何线程都有一个可以使用的区域,并且期望它是使用该区域的唯一线程.假设TLAB可以容纳100个对象,则线程只需要在分配101对象时获取锁以声明更多内存.没有TLAB,每个对象都需要这个.缺点当然是你可能浪费空间.

大型对象通常在TLAB之外分配,因为它们无法降低同步内存分配的频率.有些对象甚至可能不适合TLAB.

您可以使用-XX:TLABSize标志设置TLAB的大小,但通常我不建议您弄乱这些设置,除非您真的发现了可以解决的问题.

  • 想想线程1声称TLAB从0到99偏移,线程2从偏移100到199声明一个.合同说,一旦声明,线程2不能在0-99分配,线程1不能在100-199分配.没有线程可以将此空间声明为其未来的分配缓冲区.这样,如果每个对象占用一个假设的槽,则每个线程可以分配100个对象而不进行同步.在TLAB外部分配并不是非常昂贵,但它显然比在TLAB中更昂贵,因为它需要与可能同时运行的其他线程进行通信. (2认同)
  • 是的(不是锁,而是有一些CAS例程)。没有TLAB,线程将需要对每个分配进行“仔细检查”。使用TLAB,它最多可以分配100个实例,而无需任何其他检查。 (2认同)