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

Java 什么是TLAB(线程本地分配缓冲区)?,java,garbage-collection,java-memory-model,Java,Garbage Collection,Java Memory Model,我找不到一个全面的来源,可以清楚地解释这个概念。我的理解是,一个线程在伊甸园中分配了一些内存块,在那里它分配了新的对象。一个相互竞争的线程最终将拥有一块连续的伊甸园。如果第一个线程的TLAB中的空闲区域用完,会发生什么情况?它会请求一块新的eden吗?TLAB的想法是减少线程之间的同步需求。使用TLAB,这一需求会减少,因为任何线程都有一个可以使用的区域,并且期望它是唯一使用该区域的线程。假设一个TLAB可以容纳100个对象,那么在分配101个对象时,一个线程只需要获得一个锁来获取更多内存。如果

我找不到一个全面的来源,可以清楚地解释这个概念。我的理解是,一个线程在伊甸园中分配了一些内存块,在那里它分配了新的对象。一个相互竞争的线程最终将拥有一块连续的伊甸园。如果第一个线程的TLAB中的空闲区域用完,会发生什么情况?它会请求一块新的eden吗?

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

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


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

谢谢。1) 当一个线程分配一个TLAB时,它仍然需要获得一个锁,这样一个竞争线程就不会在第一个线程分配的同一区域分配一个TLAB。这个假设正确吗?2) 在TLAB之外分配一个对象是否总是很昂贵,因为分配每个不适合TLAB的新对象都必须获得一个锁?想想线程1声称从偏移量0到99分配一个TLAB,线程2声称从偏移量100到199分配一个TLAB。合同规定,一旦声明,线程2不能在0-99中分配,线程1不能在100-199中分配。也没有线程可以将此空间声明为其未来的分配缓冲区。这样,如果每个对象占用一个假设的插槽,则每个线程可以在不同步的情况下分配100个对象。在TLAB外部分配并不十分昂贵,但它显然比在TLAB内部更昂贵,因为它需要与可能并发运行的其他线程进行通信。对不起,如果我的问题不清楚,我试着换一种方式——如果两个相互竞争的线程想要为接下来的100个对象分配内存,并且下一个可用内存地址从100开始,那么第一个获得锁的线程将获得从100到199的地址,第二个线程将获得200到299的地址。这是正确的吗?是的(不是锁,而是一些CAS例程)。如果没有TLAB,线程将需要对每个分配进行“双重检查”。有了TLAB,它最多可以分配100个实例,而无需任何额外的检查。谢谢。我想我需要仔细阅读CAS例程。关于你的最后一个问题,我想会为线程分配一个新的TLAB。考虑分配TLAB,而不是像简单的优化那样分配小内存块,使频繁的工作线程成为本地线程,而不需要锁。