Почему мобильные платформы не поддерживают генерацию мусора?

11

В Windows Phone / Xbox и Android отсутствует поддержка сбора мусора поколений. Это расстраивает многих программистов. Кажется, есть законная техническая причина, но я не могу понять это.

Текущие телефоны имеют больше памяти и, вероятно, лучшие процессоры, чем настольные компьютеры / ноутбуки, работающие на .NET 1.1 с поколением GC еще в 2001 году, и я не могу представить себе никаких причин, по которым процессоры ARM будут хуже в поколениях GC, чем x86. Также не требуется многозадачность на телефонах и консолях, поэтому относительно больше свободного места в куче.

Так что же дает?

Изменить: несколько моментов, чтобы уточнить:

  • Эти платформы используют сборщик мусора исключительно для приложений, поэтому мой вопрос не в том, почему GC не поддерживается; мой вопрос о том, почему не сборка мусора поколений .
  • Причина, по которой люди разочарованы отсутствием GC поколений, заключается в том, что GC без поколений крайне неэффективен. (Это означает, что срок службы батареи не является причиной.)
  • Я верю, что есть некая техническая причина отсутствия поддержки GC поколений. Это не риторический вопрос.
Рей Миясака
источник
Windows Phone (текущее поколение) имеет сборку мусора. Он запускается только при нехватке
Том Сквайрс
@TomSquires GC на WP7 фактически запускается один раз в 1 МБ. Я думаю, что вы можете думать о диспетчере задач, кернинг старых процессов.
Рей Миясака

Ответы:

5

Я думаю, что самая большая проблема - это время автономной работы. Сборка мусора - это удобство разработчика, приобретаемое за счет дополнительных циклов ЦП на компьютере пользователя . Когда ваш ЦП подключен (настольный компьютер) или имеет относительно большую батарею (ноутбук), ваши пользователи с большей готовностью будут платить за удобство разработчиков за счет дополнительной энергии, потребляемой ЦП во время сбора мусора. Когда батарея относительно мала, пользователи могут быть не такими щедрыми. Они могут захотеть эту дополнительную планку для себя - возможно, поговорить со своими друзьями или убить несколько лишних свиней в смертельной схватке со злыми птицами.

Независимо от причин пользователей, разработчики ОС не хотят формировать представление о том, что устройства, работающие на их ОС, разряжают батарею быстрее, чем устройства, на которых установлена ​​ОС их конкурентов. Таким образом, они покупают лучшее восприятие ожидаемого времени автономной работы своих устройств за счет удобства разработчиков: для них ваша боль не составляет большого труда, пока пользователи довольны устройствами.

dasblinkenlight
источник
3
Поколение GC гораздо эффективнее в большинстве случаев, так что можно подумать, что это уменьшит количество тактов. Это также не объясняет, почему что-то вроде Xbox не имеет поколения GC, потому что Xboxes подключены.
Рей Миясака
Ну, это то, что я слышал о переполнении стека. Я не знаю много о XBox-е, хотя.
dasblinkenlight
3
Это все еще не отвечает на вопрос. Даже если вывоз мусора используется больше энергии , чем явное выделение (что весьма спорно - и я не буду в него), вопрос не в том, если / почему явное выделение лучше , чем GC на мобильном, это если / почему не- GC поколений лучше, чем GC поколений на мобильных устройствах.
Рей Миясака
1
@Rei: Игры обычно требуют, чтобы все было детерминированным; по крайней мере, им нужна предсказуемая производительность. Потеря нескольких наносекунд здесь и потеря нескольких наносекунд - в непредсказуемое время - может испортить игровой опыт. Сборщики мусора поколений непредсказуемы.
Муравей
2
@djacobson Не думаю, что это правда. Как я уже сказал в этом вопросе, если бы это были просто платформы Microsoft, игнорирующие GC поколений, то это, вероятно, просто материально-бюрократическая причина, и я бы не стал спрашивать. Но Android тоже страдает той же проблемой, так что, скорее всего, это техническая причина, которая означает, что кто-то на P.SE может иметь окончательный ответ.
Рей Миясака
3

Я думаю, что это не техническая причина, а то, что разработчики для этих телефонных платформ просто еще не приложили усилий. Я знаю, что это не тот ответ, на который вы надеетесь, но если вы занимались какой-либо мобильной разработкой, вы, вероятно, заметили, что есть много низко висящих фруктов. Вероятно, у них просто не было времени написать несколько реализаций GC, точно настроить их все и выбрать ту, которая лучше всего подходит. Зачем кому-то тратить время на то, чтобы заново изобретать колесо, когда вместо этого они могут выпускать новые, броские, плохо продуманные API? ;)

FWIW, и как подтверждение моей теории, у новой среды выполнения Android (ART) действительно есть GC поколения, и они планируют иметь компактную GC в будущем .

ау
источник
2

Существует несколько дополнительных затрат на сборку мусора поколений.

Коллектор поколений должен уметь определять, когда более старые объекты указывают на более новые объекты. Мы не можем проследить через более старый объект, чтобы найти эти случаи, потому что это противоречило бы цели сбора поколений. Вместо этого нам нужно как-то определить, когда это происходит, и записать это на этапе сбора. Независимо от того, как вы собираетесь это сделать, это добавит некоторые издержки к процессу сбора.

В настольной системе ваша операционная система делает все возможное с памятью за кулисами. Он поддерживает такие функции, как обмен страницами между процессами, запись неиспользуемых страниц на диск, обеспечение отображения памяти между процессами и т. Д. Насколько я понимаю, некоторые из используемых там функций позволяют более эффективно отслеживать изменение указателей. Операция уже беспокоится о том, что вы изменяете в памяти, поэтому использование этой информации для новых целей не является проблемой.

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

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