Runtime и память#
Что делает рантайм за твоей спиной: стек и куча, escape analysis, сборщик мусора, утечки и профилирование через pprof.
Оглавление#
Статьи идут в порядке чтения: от базы к деталям. Всего 11 статей.
- Стек vs Куча: где живут данные в Go — Стек и куча — два места, где может лежать значение, и разница между ними в цене уборки.
- Escape Analysis: когда переменная убегает в кучу — Escape analysis — это то, как компилятор решает, можно ли оставить значение на стеке или оно «убегает» и должно жить в куче.
- Паттерны аллокаций и снижение давления на GC — В Go обычно тормозят не вычисления, а количество выделений памяти.
- Сборщик мусора Go: concurrent tri-color mark-sweep — Сборщик мусора находит данные, на которые больше никто не ссылается, и освобождает память — причём делает это одновременно с работой программы, а не вместо неё.
- Тюнинг GC: GOGC и GOMEMLIMIT — У сборщика мусора всего две ручки:
GOGCотвечает на вопрос «как часто убираться»,GOMEMLIMIT— «сколько памяти нельзя превышать». - GOMAXPROCS: параллелизм планировщика и проблема контейнеров —
GOMAXPROCS— это сколько горутин могут исполнять Go-код по-настоящему одновременно. - Модель памяти Go (Go Memory Model): happens-before и синхронизация — Модель памяти отвечает ровно на один вопрос: если одна горутина что-то записала, когда другая гарантированно это увидит.
- Утечки памяти в Go (несмотря на GC) — Сборщик мусора убирает только то, на что никто не ссылается.
- Утечки горутин (goroutine leaks) — Утечка горутины — это горутина, которая заблокировалась навсегда и уже никогда не завершится.
- pprof: профилирование CPU, памяти и блокировок в Go — pprof — встроенный профилировщик Go: показывает, куда уходит процессорное время, кто выделяет память и на чём стоят блокировки.
- Execution Tracer и runtime/trace: тайминги вместо агрегатов — Трейсер записывает поток событий рантайма с наносекундными метками: кто когда запустился, кто чего ждал, когда работал сборщик мусора, кого сняли с процессора.