Мое приложение iPad разработано в MonoTouch, потому что я хотел избежать всего адмирала памяти, но это не похоже на ситуацию. На симуляторе все работает нормально, но когда я тестировал свое приложение на устройстве, я с ужасом обнаружил, что он быстро убивается ОС после некоторых предупреждений о памяти. Мое приложение - это простой браузер изображений, он загружает некоторые изображения PNG и показывает их, используя некоторые UIView внутри UIScrollView, загружая следующий или предыдущий при получении прикосновения. На симуляторе он отлично работает. Но на устройстве после загрузки и разгрузки около 6-11 изображений он начинает получать предупреждения о памяти, а затем внезапно процесс уничтожается. Я проверил все свои циклы, и я правильно удалю все ссылки перед загрузкой новых изображений.MonoTouch: приложение убито за низкую память, почему? Распределение живых байтов 5 МБ top
Итак, я начал работу с инструментами и начал профилировать выделение памяти моего приложения на iPad. Там я обнаружил, что байты Live составляют всего около 5-9 МБ, только то, что я ожидал, но по какой-то странной причине объем мертвой памяти почти не собран, потому что после выделения около 50 МБ (менее 5-9 МБ это Live Bytes), он убит! Вот скриншот из инструментов профилирования сессии моего приложения:
А вот последовательность heapshots:
Есть также некоторые небольшие утечки, но я думаю, что они недостаточно велики, чтобы быть виновниками. Они все 48 байт утечки из strdup, известная проблема при выпуске UIScrollView в прошивкой 5.1:
Даже со всем, что кажется нормально и Текущий Bytes выделенный по-прежнему на 5 Мб, реальная память о моем приложение растет в геометрической прогрессии, прежде чем убить до 50Мб на IPAD, и до 314 МБ на iPhone4S, как сообщает Monitor Memory:
ли кто-нибудь может сказать мне, если есть способ, или полезности, чтобы узнать, что и где проблема? Это ошибка сборщика мусора monotouch? Или есть какой-то объект, который я не правильно распоряжаюсь? И как я могу найти тех, у кого есть профилировщик? Я проверил свой код на два дня, но все кажется правильным.
Вот мой код для загрузки/инстансов/располагающий цикла:
void StartImageLoadingThread()
{
tokenSource = new CancellationTokenSource();
token = tokenSource.Token;
Task task1 = new Task(() => PerformLoadImageTask(token),token);
task1.Start();
}
void PerformLoadImageTask(CancellationToken token)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Task {0}: Cancelling", Task.CurrentId);
return;
}
current_uiimage_A = UIImage.FromFileUncached(file_name);
page_A_image_view.Image = current_uiimage_A;
}
void UnloadImageAFromMemory()
{
page_A_image_view.Image = null;
current_uiimage_A.Dispose();
current_uiimage_A = null;
}
Есть ли способ, чтобы поймать объект, который не был правильно расположенными? Инструменты сообщают, что живые байты являются низкими, утечки почти равны нулю, то почему мертвые объекты не удаляются? Даже если ничего не происходит в моем приложении в течение нескольких минут, GC, похоже, не делает его работу, даже если я назову ее экспликацией в моем коде. Я даже попробовал новый экспериментальный сборщик мусора, но еще хуже и быстрее сделать мое приложение убитым.
Невозможно найти руководство или пошаговое руководство на веб-сайте Xamarin для устранения неполадок с памятью или устранения неправильных распределений.
Любая помощь или предложение очень ценится, Спасибо!
ОБНОВЛЕНИЕ: Я уменьшил размер и разрешение некоторых изображений и uiviews, а Live Bytes теперь сброшены с 9 МБ до 5 МБ, но приложение все еще убито после некоторых предупреждений о памяти, независимо от того, что ,
ОБНОВЛЕНИЕ 2: Как предложил Хавьер, я удалил фоновые задачи и сделал прямые звонки, и утечка памяти исчезла! Кажется, что сборщик мусора MonoTouch имеет ошибку и не может собирать память, когда UIImages распределены и расположены в другом потоке. Но теперь мое приложение ужасно не отвечает, когда я прокручиваю, поэтому мне нужно найти решение, чтобы сделать это в другом потоке! Но как?
Вы правы! Я удалил фоновые задачи и сделал прямые звонки, и утечка памяти исчезла! Похоже, что сборщик мусора MonoTouch имеет ошибку, когда UIImages выделяются в другом потоке. Но теперь мое приложение не отвечает, когда я прокручиваю, поэтому мне нужно найти решение, чтобы сделать это в другом потоке! Но как? –
Ну, вы можете заполнить ошибку в https://bugzilla.xamarin.com/. Мой английский не очень хорош, я боюсь, что они меня не очень хорошо понимают ... :( –
Я считаю, что они знают об ошибке. Я читал, что бета-версия MonoTouch 5.3 имеет некоторые проблемы с некоторыми проблемами многопоточности UIKit Давайте подождем и посмотрим, устранит ли она нашу проблему. –