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

What is a TLAB (Thread Local Allocation Buffer)?

我找不到可以清楚地解释这个概念的综合资源。我的理解是,线程在分配新对象的伊甸园中获得了一些内存块。一个竞争线程最终将拥有一个有点连续的伊甸园块。如果第一个线程用完其 TLAB 中的空闲区域会怎样?它会请求一块新的伊甸园吗?

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

大对象通常在 TLAB 之外分配,因为它们失去了降低同步内存分配频率的优势。有些对象甚至可能放不下 TLAB。

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