Собиратель мусора 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.