2016-03-15 4 views
3

This статьи на Wired о переходе Dropbox в от Go к ржавчине для его MagicPocket продукта говоритЧто такой объем памяти Его

«объем память» -The объем памяти компьютера, он требует во время работы Волшебного Карман-был слишком высок для массовых систем хранения, которые компания пыталась построить.

Вопрос (ы): Что именно гоу «памяти след» (откуда она родом, как она измеряется и т.д., это связано со сбором мусора, бинарной размер, это что-то, что всегда будет высоким) и почему он выше, чем у Руста?

+4

Вот что сказал Dropbox * на самом деле *, а не то, что Wired перефразировал: https://news.ycombinator.com/item?id=11283688 (плакат там инженер) – elithrar

ответ

4

«У него был большой объем памяти» - это еще один способ сказать, что в их программе используется много оперативной памяти. Это связано с сбором мусора в том, что GC'd программы периодически освобождают память (потому что каждый цикл GC занимает процессорное время), тогда как управление ручной памятью имеет тенденцию освобождать память более или менее, как только она не используется.

Недостатком ручного управления памятью является либо то, что ошибки могут приводить к сбоям и ошибкам безопасности (как на C++, где вы можете случайно использовать освобожденную переменную после повторного использования памяти для чего-то еще), или вам нужно приложить усилия выражая точные времена жизни каждой переменной, ссылки и т. д. в вашем коде, чтобы компилятор мог проверить, что они используются действительным образом (как в Rust, где вы взаимодействуете с the borrow checker, чтобы исправить потенциально неправильное использование памяти в ваш код).


Предложение в Wired истории делает это звучит как «объем памяти» является простой измеримой величиной можно назначить на любой язык (и ваш вопрос принимает эту идею до логического конца). Это не так просто. На разных языках разные вещи имеют разные затраты на память, производительность и т. Д., И вы должны понимать детали языков/времени работы, чтобы знать, как язык будет работать с определенной программой.

Например, CPython имеет reference counting и освобождает неиспользуемую память раньше, но за счет необходимости хранить и обновлять подсчет ссылок. Java имеет, с одной стороны, такие вещи, как заголовки объектов, которые добавляют определенный объем служебных данных памяти для каждого объекта, но использует некоторые трюки для ускорения сбора мусора (например, коллекцию поколений), которые Go пока не делают. Или в Go, вы можете попытаться уменьшить объем памяти программы на recycling memory with free pools и настроить GOGC на освобождение неиспользуемой памяти чаще, как сказал костя.

Больше не существует того, что эти конкретные детали, которые я перечислял, являются очень важными, но что может быть много деталей, чтобы рассмотреть другие, чем «более высокий объем памяти» или «меньший объем памяти».


Итак: «площадь памяти» относится к объему ОЗУ для конкретной программы с определенной рабочей нагрузкой. Большая картина, это один из факторов большого набора компромиссов, которые люди, как вы, я или команда Dropbox, должны перемещаться.

1

Сборщик мусора требует бесплатной работы с памятью для эффективной работы. По умолчанию программе Go требуется примерно вдвое больше памяти, чем размер набора данных в реальном времени (память, занятая объектами приложения).

Это может быть настроено с использованием переменной окружения GOGC. Установив его на более низкое значение, приложение будет запрашивать меньше памяти из ОС, но GC будет работать чаще, поэтому будет использовать больше ресурсов ЦП. Установив его на более высокое значение, GC будет работать менее часто и использовать меньше ресурсов, но приложение будет иметь более высокий «объем памяти».

Это общая идея, но точная память, требования к производительности и эффект GOGC очень специфичны для приложений.