Golang-дайджест № 20 (1 – 31 августа 2022)
Свежая подборка новостей и материалов
Выпущена версия 1.19 — что нового:
- Сборщику мусора теперь можно задать ограничение памяти. Подробнее здесь.
- Модель памяти теперь явно определяет поведение sync/atomic пакета.
- Пакет os/exec больше не учитывает относительные пути при PATH поиске.
- Комментарии к документам теперь поддерживают ссылки, списки и заголовки с префиксом.
- Исправления проблем, связанных с дженериками.
- discussion: Добавление стандартного интерфейса итератора в Go?
- GoLand Roadmap 2022.3
- Выпущен GoLand 2022.2
Alcione Ribeiro опубликовала в github схему вязания крючком, чтобы связать своего собственного персонажа Go gopher!
Awesome:
- https://awesome-go.com/
- https://github.com/guardrailsio/awesome-golang-security
- https://github.com/Binject/awesome-go-security
- https://gist.github.com/hbt/d6ab942b882d5b94f331c5257076d05e
- https://github.com/avelino/awesome-go
@Golang_google
Свежая подборка новостей и материалов
Выпущена версия 1.19 — что нового:
- Сборщику мусора теперь можно задать ограничение памяти. Подробнее здесь.
- Модель памяти теперь явно определяет поведение sync/atomic пакета.
- Пакет os/exec больше не учитывает относительные пути при PATH поиске.
- Комментарии к документам теперь поддерживают ссылки, списки и заголовки с префиксом.
- Исправления проблем, связанных с дженериками.
- discussion: Добавление стандартного интерфейса итератора в Go?
- GoLand Roadmap 2022.3
- Выпущен GoLand 2022.2
Alcione Ribeiro опубликовала в github схему вязания крючком, чтобы связать своего собственного персонажа Go gopher!
Awesome:
- https://awesome-go.com/
- https://github.com/guardrailsio/awesome-golang-security
- https://github.com/Binject/awesome-go-security
- https://gist.github.com/hbt/d6ab942b882d5b94f331c5257076d05e
- https://github.com/avelino/awesome-go
@Golang_google
👍17🔥2❤1
Go использует собственную, достаточно сложную модель аллокации памяти, которая сильно отличается от традиционного
malloc
. Вместо прямой работы с кучей Go оперирует несколькими уровнями: - Arena - основной блок памяти в 64 МБ, который Go выделяет у ОС.
- Page - каждая арена делится на страницы по 8 КБ.
- Span - набор страниц, который используется для аллокаций объектов одного размера.
- Size class - категории размеров объектов (от tiny до large), каждая из которых имеет свой способ обработки.
Память также делится на:
- scan (объекты с указателями, которые должен обходить GC),
- noscan (объекты без указателей, GC может их игнорировать).
Аллокация объектов
- Tiny-объекты (менее 16 байт) могут группироваться в один слот для ускорения.
- Small-объекты (до 32 КБ) выделяются из span’ов в соответствии с size class.
- Large-объекты (более 32 КБ) выделяются напрямую из кучи (heap).
Escape analysis
Go-компилятор анализирует, выходит ли переменная за пределы функции:
- если нет → объект попадает на стек,
- если да → объект уходит в кучу.
Это решает судьбу каждой переменной и напрямую влияет на работу GC.
Стек горутин
- Каждая горутина стартует со стека в 2 КБ.
- Стек растёт динамически (copy & grow) и может сжиматься.
- При глубокой рекурсии или сложных вычислениях рост стека может быть дорогим, так как требует копирования всех данных.
Практические советы
1. Избегайте лишних tiny / small аллокаций в горячих функциях - каждая мелочь создаёт нагрузку на GC.
2. Переиспользуйте срезы и буферы (`row[:0]`, sync.Pool) для минимизации мусора.
3. Объединяйте переменные в структуры, если они живут одинаковое время, чтобы уменьшить число malloc’ов.
4. Следите за размером объектов, чтобы они не перескакивали из small в large — это увеличивает расходы.
5. Профилируйте escape analysis (`go build -gcflags="-m"`) - он покажет, какие переменные уходят в кучу, а какие остаются на стеке.
6. Следите за ростом стека в рекурсивных функциях - копирование может быть дорогим.
Контроль над аллокацией в Go - это контроль над работой GC. Если понимать, как именно Go управляет памятью, можно проектировать код так, чтобы минимизировать аллокации, упростить жизнь GC и получить значительный прирост производительности.
@golang_google
#golang #go #memory
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥58👍24❤16