У меня возникли проблемы с сборщиком мусора в Mono для Android, и я изучал его и сказал, что мне нужно вручную вручную установить GC.Collect() в каждом методе OnDestroy(), чтобы освободить объекты что я не использую, а также пытаюсь использовать Dispose для Java.Lang.Objects, но приложение все еще требует и увеличивает память. Как я могу это решить?Моно для Android Memory Leaks
ответ
Основной вопрос: действительно ли это проблема? Сборщики мусора, по своей природе, не детерминированы, поэтому использование памяти будет немного отличаться. Это не обязательно проблема; это просто часть того, как обстоят дела. Если вы регулярно исчерпываете глобальные ссылки или исчерпываете кучу процесса, то это проблема. Если вы просто видите увеличение уровня grefs, но они уменьшаются при сборе коллекции, это может не стоить беспокоиться.
Если это проблема, нам нужна специфика проблемы. Например, Bitmap экземпляры могут легко exhaust memory, а solutions for Bitmaps необязательно применимы ко всему в целом.
Чтобы получить более подробную информацию, вы можете включить Global Reference Messages, чтобы увидеть, когда глобальные ссылки создаются и уничтожаются.
Кроме того, мы постоянно обновляем эвристику GC. Mono для Android 4.1.0 ввела изменение, в котором GC.Collet()
вызывается автоматически, когда мы нажимаем порог gref 80% от максимального значения gref для платформы (1800 grefs на эмуляторе). Это должно устранить большую часть необходимости для OnDestroy()
для вызова GC.Collect()
, хотя (как всегда) GC может ударить в «неподходящие моменты», поэтому в любом случае может быть предпочтительным явный GC.Collect()
.
Не можете найти более подробную информацию о своих исследованиях? –
Я могу предоставить некоторые ссылки, которые они ссылаются на ту же проблему – arkmetal
http://docs.xamarin.com/android/advanced_topics/garbage_collection#Helping_the_GC – arkmetal