Go

Керування пам'яттю

Stack vs heap, escape analysis, garbage collector, профілювання пам'яті, pprof, витоки пам'яті

24 питань зі співбесід·
Senior
1

Яка основна різниця між виділенням на stack і виділенням на heap у Go?

Відповідь

Stack керується автоматично, і виділення на ньому надзвичайно швидкі (просте переміщення stack pointer). Змінні на stack автоматично звільняються, коли функція повертає значення. Heap потребує garbage collector для звільнення пам'яті, і виділення на ньому повільніші, оскільки залучають runtime Go. Змінні, що залишаються живими після функції або чий розмір невідомий під час компіляції, потрапляють на heap.

2

Що таке escape analysis у Go?

Відповідь

Escape analysis — це статичний аналіз, який виконує компілятор Go, щоб визначити, чи може змінна залишитися на stack, чи має бути виділена на heap. Якщо компілятор виявляє, що змінна референсується поза функцією, де її створено (через повернений вказівник, збереження в глобальній змінній тощо), змінна «escape» і буде виділена на heap. Цей аналіз автоматично оптимізує виділення пам'яті.

3

Як переглянути результати escape analysis під час компіляції?

Відповідь

Прапорець -gcflags=-m дозволяє переглянути рішення escape analysis. Використання -m=2 або -m=3 дає більше деталей про те, чому змінна escape. Наприклад, 'go build -gcflags=-m=2' покаже повідомлення на кшталт 'moved to heap: x', що вказує на переміщення змінної на heap. Цей інструмент необхідний для оптимізації виділення пам'яті в критичному коді.

4

У якому випадку локальна змінна escape на heap?

5

Яка основна роль garbage collector у Go?

+21 питань зі співбесід

Опануй Go для наступної співбесіди

Отримай доступ до всіх питань, flashcards, технічних тестів, вправ code review та симуляторів співбесід.

Почни безкоштовно