我找不到全面的资源来清楚地解释这个概念。我的理解是,线程在eden中分配了一些内存,在其中分配新对象。竞争线程最终将具有一定程度连续的eden块。如果第一个线程用完了其TLAB的可用空间,会发生什么情况?是否需要新的伊甸园块?

最佳答案

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

大对象通常在TLAB之外分配,因为它们没有降低同步内存分配频率的优势。有些对象甚至可能无法放入TLAB中。

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

09-26 20:29