Комментарии 12
Спасибо за разбор.
1.
Если предположить, что TLAB'ы заполняются ± равномерно (в реальных приложениях это может быть не так), то в среднем оставшиеся TLAB'ы будут заполнены примерно наполовину.
Почему на половину? Вся последующая тема с 50% заполнением тоже непонятна.
Список который начинается с "Возьмем это на заметку и вернемся обратно к процессу аллокации" непонятно откуда берется, возможно пропущен абзац или кусок кода?
- Зачем нужна явная prefetch-инструкция, CPU же делает это автоматически?
Почему на половину?Если принять заполненность тлаба за случайную величину, принимающую значения из диапазона [0; 1] ([0%; 100%]), то, при ее равномерном распределении, среднее значение будет 0.5 или 50%
А что если поток (и тлаб для него) создан в между сборками, когда другие тлабы уже как-то заполнены? Это учитывается?
В изначальной гипотезе это никак не учитывается, это самое простое приближение, которым можно воспользоваться: все TLAB заполняются равномерно.
В реализации это используется с помощью учитывания allocation fraction.
Про равномерность ответил в соседнем треде.
Не пропущен, там просто опущены неинтересные детали про выбор "идти в быструю ветку или в медленную" и получился такой некрасивый переход, постараюсь как-нибудь поправить.
- Автоматический префетч срабатывает только когда идут последовательные обращения к памяти с фиксированной дельтой, а тут паттерн "аллокация -> произвольные действия -> следующая аллокация" и нужен префетч памяти под следующую аллокацию. Аналогичным образом можно было бы префетчить, например, итерацию по linked-list'у
Эх, когда же люди перестанут отождествлять JVM и HotSpot?.. ;)
Делай доклад на конфу. Кишочки норм.
Как JVM аллоцирует объекты?