Средство управления миссиями Java в JDK предоставляет статистику распределения объектов в новых TLAB и распределениях вне TLAB. (Это под памятью/распределением). Каково значение этих статистических данных, что хорошо для производительности приложения? Должен ли я беспокоиться, если некоторые объекты выделены вне TLAB, и если да, что я могу сделать с ним?
Выделения в новых TLAB и распределениях вне TLAB
Ответ 1
TLAB - это локальный буфер распределения потоков. Объекты обычного пути выделяются в HotSpot в пределах TLAB. Выделение TLAB может выполняться без синхронизации с другими потоками, так как Buffer Allocation Buffer является потоковой локалью, синхронизация необходима только при получении новой TLAB.
Итак, идеальный сценарий заключается в том, что максимально возможное распределение выполняется в TLAB.
Некоторые объекты будут выделены за пределами TLAB, например больших объектов. Об этом не стоит беспокоиться, пока процент распределений вне TLAB и распределений в новых TLAB невелик.
TLAB динамически изменяются во время выполнения для каждого потока отдельно. Таким образом, если поток выделяет очень много, новые TLAB, которые он получает из кучи, будут увеличиваться в размере. Если вы хотите, вы можете попытаться установить флаг -XX:MinTLABSize
для установки минимального размера TLAB, например
-XX:MinTLABSize=4k
Ответ моего коллеги Дэвида Линдхольма:)