Чому мобільні платформи не підтримують покоління сміття?


11

І Windows Phone / Xbox, і Android не мають підтримки для збору сміття з поколіннями. Це неприємно для багатьох програмістів. Здається, це є законною інженерною причиною, але я не можу цього зрозуміти.

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

То що дає?

Редагувати: декілька пунктів для уточнення:

  • Ці платформи використовують сміття виключно для додатків, тому моє питання не в тому, чому GC не підтримується; моє запитання про те, чому покоління сміття не відбувається.
  • Причиною того, що люди засмучені відсутністю генерації ГК, є те, що негенераційна ГК надзвичайно неефективна. (Це означає, що час автономної роботи не є причиною.)
  • Я вважаю, що існує непідробна технічна причина відсутності покоління в GC. Це не риторичне питання.

У телефоні Windows (поточне покоління) є збирання сміття. Він працює лише тоді, коли у пристрою мало пам’яті msdn.microsoft.com/en-us/library/gg490770.aspx
Tom Squires

@TomSquires GC на WP7 працює фактично один раз на 1 МБ асигнувань. Я думаю, ви, можливо, думаєте про диспетчер завдань, що керує старими процесами.
Рей Міясака

Відповіді:


5

Я думаю, що найбільша проблема - це час автономної роботи. Збір сміття є розробником зручність купив за ціною додаткових циклів процесора на користувача комп'ютера. Коли ваш процесор підключений (настільний ПК) або має відносно великий акумулятор (ноутбук), ваші користувачі готові платити за зручність розробників за додаткову енергію, яку споживає процесор під час збору сміття. Якщо акумулятор відносно невеликий, користувачі можуть бути не такими щедрими. Вони можуть захотіти того додаткового бару для себе - можливо, поговорити зі своїми друзями або вбити кількох зайвих свиней у смертельній зустрічі з розлюченими птахами.

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


3
Фактично генераційний GC набагато ефективніший у більшості випадків, тому ви можете подумати, що це зменшить кількість циклів годин. Це також не пояснює, чому щось на кшталт Xbox не має покоління GC, тому що Xboxes підключено.
Rei Miyasaka

Ну, це те, що я чув на Stack Overflow. Я не знаю багато про 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 вимагає використання заборів для запису для виявлення, коли записуються об'єкти старшого покоління. З іншого боку, навіть якщо б "знакова" частина GC не могла отримати користь від поколінь, я думаю, що все-таки можна було б покращити продуктивність, лише переміщуючи речі в нових поколіннях (насправді, виконуючи фазу "тегів" для старших поколінь, як а також новіше може бути корисним, якби воно дозволило знати, скільки пам'яті, що відновлюється, існує в кожному поколінні).
supercat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.