Собиратель мусора Android приостанавливает работу других приложений во время работы?

Я нашел некоторую информацию об сборщике мусора Android, которые противоречат мне.

В руководстве Android Devevelopers сказано:

Android 3.0 - первая версия платформы, предназначенная для запуска либо одноядерные, либо многоядерные архитектуры процессоров. Разнообразие изменения в Dalvik VM, Bionic library и в других местах добавляют поддержку для симметричной многопроцессорности в многоядерных средах. Эти оптимизация может принести пользу всем приложениям, даже тем, которые однопоточный. Например, с двумя активными сердечниками однопоточный приложение может по-прежнему видеть повышение производительности, если мусор Dalvik коллектор работает на втором ядре. Система обеспечит это автоматически ".

Хорошо, теперь другая вещь

Согласно этой ссылке: Архитектура виртуальной машины Dalvik андроид использует маркер и развертку aproach.

Текущая стратегия в сборщике мусора Dalvik заключается в том, чтобы сохранить отметку бит или биты, указывающие, что конкретный объект "достижимый", и поэтому не следует собирать мусор, разделить из другой памяти кучи.

Если мы проверим, как эта метка и развертка работают по этой ссылке: Отметить и отладить алгоритм сбора мусора , мы можем видеть это:

Основным недостатком подхода mark-and-sweep является тот факт, что что обычное выполнение программы приостанавливается, пока мусор выполняется алгоритм сбора. В частности, это может быть проблемой в программа, которая взаимодействует с пользователем пользователя или которая должна удовлетворять ограничения выполнения в реальном времени. Например, интерактивный приложение, использующее сбор мусора маркировки и очистки периодически не реагирует.

Итак, теперь мой вопрос: как это работает? Собирает ли сборщик мусора все, пока он работает, или он может работать полностью независимо от другого активного ядра процессора?

Ответ 1

В драйвере Dalvik в версии Gingerbread и выше используется сборщик мусора Чаще всего параллельный сборщик с периодом паузы, обычно около 5 мс. Поэтому да, GC влияет на другие приложения, останавливая их, но алгоритм параллельного GC способен минимизировать эти паузы.

Вы должны посмотреть:

В целом, теория коллекции мусора [Вики-сборник мусора] объясняет:

  • Стоп-мир сборщики мусора полностью останавливают выполнение программы для запуска цикла сбора

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

  • Совлокальные сборщики мусора не останавливают выполнение программы вообще, за исключением, возможно, ненадолго, когда сканируется стек выполнения программы.

Ответ 2

Полная независимость довольно невозможна: сборщик мусора и программа используют одну и ту же память и должны каким-то образом общаться. Даже "безрезультатные" GC, такие как Azul (кстати, хорошее чтение: http://www.artima.com/lejava/articles/azul_pauseless_gc.html), имеют технические паузы. Вероятно, Dalvik (чистая догадка, основанная на анекдотических доказательствах и ресурсах, которые в течение последних 15 лет, вероятно, выливались в JVM, такими как IBM, Sun и Oracle) за новейшие технологии, найденные в JVM, поэтому я подозреваю, что паузы будут длиннее.

Ответ 3

Он не будет останавливать другие приложения, это может приостановить ваше приложение. Знак и развертка не должны останавливать всю обработку, это просто самый простой способ сделать это. Вероятно, у него есть некоторые моменты, когда он приостанавливает выполнение, а другой - нет. Единственный реальный способ рассказать - это посмотреть на код Dalvik VM. И я не буду рассчитывать на то, что это тот же ответ во всех версиях Android.