Материал проходит вычитку — возможны неточности.
Урок 16 из 118

Escape analysis: стек или куча

После очередной фичи — сводки по каталогу на каждой странице поиска — память «Полки» поползла вверх. Миша поставил эксперимент: включил диагностику и стал искать, какие значения уходят в кучу.

Главная мысль

компилятор решает, где живёт значение — на стеке или в куче; от этого решения корректность не зависит, только скорость, и принимает его escape analysis.

Две судьбы одной переменной

Когда ты пишешь x:= 42, компилятор решает, где будет жить x — на стеке или в куче. От этого решения корректность программы не зависит, только скорость: аллокация в куче означает работу сборщика мусора, а стековая переменная просто исчезает вместе с кадром функции.

Решение принимает escape analysis — статический анализ, который компилятор выполняет при сборке. Название передаёт суть: значение «сбегает» (escapes) в кучу, если компилятор не может доказать, что оно не переживёт функцию, в которой создано.

Что на кону

Переменная на стеке не требует аллокации в привычном смысле: компилятор резервирует под неё место в кадре функции, при возврате кадр выбрасывается целиком. Быстро, и GC про неё не знает. Переменная в куче — это runtime.mallocgc, учёт в GC, а при каждой сборке — сканирование и пометка. Одна лишняя аллокация на запрос — мелочь, но на сервере под нагрузкой такие мелочи складываются в проценты процессорного времени.

Консервативность

Escape analysis консервативен: если компилятор не уверен, он отправляет значение в кучу. Ошибка в сторону стека обернулась бы висячим указателем, поэтому анализ ошибается только в сторону лишней кучи. Это не гарантия языка, а оптимизация: спецификация не обещает, что какое-то значение окажется на стеке.

Задание · вопросы

Проверьте себя

Вопрос 1 из 3

Кто и когда решает, где будет жить значение — на стеке или в куче?

Вопрос 2 из 3

В какую сторону может ошибаться escape analysis?

Вопрос 3 из 3

Зависит ли корректность программы от решения «стек или куча»?

Итоги

Escape analysis решает «стек или куча»: стек — бесплатно и без GC, куча — аллокация и работа сборщика. Анализ консервативен и ошибается только в сторону кучи.

Наш сайт собирает куки. Чтобы тебе было удобнее им пользоваться. Нажимая на кнопку, ты даёшь разрешение собирать куки