Что такое TLAB (потоковый локальный буфер распределения)?

Я не мог найти исчерпывающий источник, который бы четко объяснил концепцию. Я понимаю, что потоку задан некоторый фрагмент памяти в eden, где он выделяет новые объекты. Конкурирующий поток будет иметь несколько последовательный кусок eden. Что произойдет, если первый поток закончится из свободной области в TLAB? Будет ли он запрашивать новый кусок eden?

Ответ 1

Идея TLAB заключается в уменьшении необходимости синхронизации между потоками. Используя TLAB, эта потребность уменьшается, поскольку любой поток имеет область, которую он может использовать, и ожидайте, что это единственная нить, использующая эту область. Предполагая, что TLAB может содержать 100 объектов, потоку потребуется всего лишь захватить блокировку, чтобы требовать больше памяти при распределении объекта 101. Без TLAB это потребуется для каждого объекта. Недостатком, конечно же, является то, что вы потенциально теряете пространство.

Большие объекты обычно выделяются вне TLAB, поскольку они лишают преимущество уменьшения частоты синхронизации памяти. Некоторые объекты могут даже не вписываться в TLAB.

Вы можете установить размер TLAB с помощью флага -XX:TLABSize, но обычно я не рекомендую вам связываться с этими настройками, если вы действительно не обнаружили проблему, которую вы можете решить.