Escape analysis: стек или куча
После очередной фичи — сводки по каталогу на каждой странице поиска — память «Полки» поползла вверх. Миша поставил эксперимент: включил диагностику и стал искать, какие значения уходят в кучу.
компилятор решает, где живёт значение — на стеке или в куче; от этого решения корректность не зависит, только скорость, и принимает его escape analysis.
Две судьбы одной переменной
Когда ты пишешь x:= 42, компилятор решает, где будет жить x — на стеке или в куче. От этого решения корректность программы не зависит, только скорость: аллокация в куче означает работу сборщика мусора, а стековая переменная просто исчезает вместе с кадром функции.
Решение принимает escape analysis — статический анализ, который компилятор выполняет при сборке. Название передаёт суть: значение «сбегает» (escapes) в кучу, если компилятор не может доказать, что оно не переживёт функцию, в которой создано.
Что на кону
Переменная на стеке не требует аллокации в привычном смысле: компилятор резервирует под неё место в кадре функции, при возврате кадр выбрасывается целиком. Быстро, и GC про неё не знает. Переменная в куче — это runtime.mallocgc, учёт в GC, а при каждой сборке — сканирование и пометка. Одна лишняя аллокация на запрос — мелочь, но на сервере под нагрузкой такие мелочи складываются в проценты процессорного времени.
Консервативность
Escape analysis консервативен: если компилятор не уверен, он отправляет значение в кучу. Ошибка в сторону стека обернулась бы висячим указателем, поэтому анализ ошибается только в сторону лишней кучи. Это не гарантия языка, а оптимизация: спецификация не обещает, что какое-то значение окажется на стеке.
Проверьте себя
Кто и когда решает, где будет жить значение — на стеке или в куче?
В какую сторону может ошибаться escape analysis?
Зависит ли корректность программы от решения «стек или куча»?
правильных ответов
Escape analysis решает «стек или куча»: стек — бесплатно и без GC, куча — аллокация и работа сборщика. Анализ консервативен и ошибается только в сторону кучи.
10 000 ₽ · 60 минут · онлайн