Как gc Go управляет распределением кучи? - PullRequest
0 голосов
/ 11 января 2019

Предусматривает ли gc Go (в частности, go1.11) предварительное выделение фрагмента памяти и извлекает из него для каждого выделения (например, JVM), или он выделяет каждый раз, когда создается переменная, и является ли это вызовом ядра (malloc)

Если это будет один вызов ядра на выделение, это сделает создание переменных дорогостоящим. Как я могу форсировать выделение в стеке / куче?

1 Ответ

0 голосов
/ 12 января 2019

Это покрыто в разных местах, например FAQ :

Как узнать, расположена ли переменная в куче или в стеке?

С точки зрения правильности вам не нужно знать. Каждая переменная в Go существует до тех пор, пока есть ссылки на него. Хранение расположение, выбранное реализацией, не имеет отношения к семантике языка.

Место хранения влияет на эффективность записи программы. Когда это возможно, компиляторы Go будут выделять переменные, которые являются локальными для функции в кадре стека этой функции. Однако если компилятор не может доказать, что на переменную не ссылаются после функция возвращает, тогда компилятор должен разместить переменную на сборка мусора во избежание ошибок висячих указателей. Кроме того, если Локальная переменная очень велика, возможно, имеет смысл хранить ее в куче, а не в стеке.

В текущих компиляторах, если переменная имеет свой адрес, то Переменная является кандидатом для размещения в куче. Тем не менее, основной Анализ побега распознает некоторые случаи, когда такие переменные не будут жить после возврата из функции и может находиться в стеке.


Распределение памяти Go тщательно оптимизировано для его нужд, например, с помощью custom malloc . Я подозреваю, что у вас есть немного другой основной вопрос / проблема, с которой вы боретесь - лучше было бы задать это вместо этого. Если это просто исследование / любопытство, вам придется сделать свой вопрос гораздо более конкретным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...