Я читаю документы по сбору мусора Xamarin.Android по поводу того, что GC помогает лучше работать на reducing referenced instances.Алгоритм сбора мусора Xamarin Android
Раздел начинается словами:
Всякий раз, когда экземпляр типа java.lang.Object или подкласса сканируется во время GC, весь объект график, который экземпляр относится также должны быть отсканированы. Граф объекта представляет собой набор экземпляров объектов, к которым относится «корневой экземпляр», плюс все, на что ссылается рекурсивный экземпляр корневого экземпляра.
... который я понимаю.
Затем он показывает, что пользовательский класс наследуется от стандартного класса Activity. Этот пользовательский класс активности имеет поле, которое представляет собой список строк, который инициализируется в конструкторе, чтобы иметь 10 000 строк. Говорят, что это плохо, потому что все 10 000 экземпляров должны быть проверены на предмет доступности во время GC. Это я также понимаю.
Часть, которую я не знаю, является рекомендуемым исправлением: в ней указано, что поле List<string>
должно быть перенесено в другой класс, который не наследуется от Java.Lang.Object
, а затем экземпляр этого класса должен ссылаться только на активность как и в предыдущем списке.
Мой вопрос: как толкование поля глубже в графе объектов помогает GC, когда общее количество экземпляров по-прежнему составляет 10 000, а в первом абзаце говорится, что они будут отсканированы в конце концов, потому что процесс рекурсивный?
Как примечание, я также читаю (here) на SGen GC, используемом Mono на Android, и процесс обхода графика объекта описывается как начальный с корнем GC. Это объясняет, как список из 10 000 элементов вызовет более длительную паузу GC, поскольку каждый элемент проверен, но все же не объясняет, как перемещение этого списка вглубь в график поможет, потому что GC в конечном итоге сканирует его по мере того, как он будет углубляться в график.
Идея заключается в том, что мы избегаем того, чтобы сделать коллегиальный прогулку. В противном случае нам нужно будет искать как «управляемые», так и «Java» отношения на этих объектах. Обычно вы можете запускать свой объект, перейдя в класс 'static' и вне производного класса' Activity', поэтому он не зависит от партнера. Я бы сказал, что большую часть времени это не серьезная проблема, и вы должны просто нормально закодировать. Если вы затем профилируете свое приложение и обратите внимание на узкие места GC, вы теперь точно знаете, что делать. т. е. разделить эти классы от одноранговых объектов, которые их потребляют.Вкратце: не беспокойтесь об этом, пока не понадобится –
@JonDouglas благодарит за ответ. Не могли бы вы прояснить, что значит «совершить одноранговую прогулку» и как принято решение сделать это или избежать этого? В общем, я думаю, что мы могли бы действительно использовать статью, в которой объясняется, как создаются объекты и GC'd в Xamarin Android, учитывая, что архитектура «двух виртуальных машин, работающих бок о бок» ... с хорошо прописанными должно помочь нам понять фразы типа " совершить одноранговую прогулку »и, возможно, помочь нам избежать ошибок, обсуждаемых в этом разговоре [Xamarin Evolve] (https://www.youtube.com/watch?v=VJsmrTQWD2k). –