Странный Jetsam/ Сбой в малой памяти - нет предупреждения памяти
Я ценю вашу помощь с этой проблемой, я действительно застрял.
Один из моих бета-тестеров сообщает о частых сбоях моего приложения. Журнал iOS сообщает:
Apr 15 23:52:14 iPhone SpringBoard[58] <Warning>: Application 'UIKitApplication:de.loffler.XBMCMusicRemotePro[0x553a]' was killed by jetsam.
Apr 15 23:52:14 iPhone UserEventAgent[26] <Warning>: 440891049998: id=de.loffler.XBMCMusicRemotePro pid=1518, state=0
Так что приложение было убито из-за нехватки памяти. Обычно я знаю, что делать (ищите утечки и т. Д.), Однако есть некоторые проблемы, которые действительно странные:
1. Низкое использование памяти
Согласно JetsamEvent.ips, использование памяти моим приложением составляет всего 32 МБ (если я правильно интерпретирую отчет: 2050 резидентных страниц * 16384 размера страницы). Тестер имеет iPhone 6S с 2 ГБ оперативной памяти, поэтому в момент сбоя приложение использует не более 2% всей памяти устройства. Кроме того, если я суммирую "rpages" всех записей в отчете, я получу ок. 620 МБ использования. Может быть, у меня возникли некоторые недоразумения при чтении отчета...
Я написал тестовую функцию, которая просто потребляет память, пока приложение не будет убито. При запуске этой функции на моем iPhone 5S приложение перестает работать, когда оно достигает 600 МБ памяти.
{"timestamp":"2016-04-15 23:52:13.13 +0200","bug_type":"298","os_version":"iPhone OS 9.3 (13E234)"}
{
"crashReporterKey" : "bec1fa98267fbf2d761102140fcf61aa7b6b5e25",
"kernel" : "Darwin Kernel Version 15.4.0: Fri Feb 19 13:54:52 PST 2016; root:xnu-3248.41.4~28\/RELEASE_ARM64_S8000",
"product" : "iPhone8,1",
"incident" : "A2B3C5FF-8ECC-4E07-BEDA-E847061F396B",
"date" : "2016-04-15 23:52:13.13 +0200",
"build" : "iPhone OS 9.3 (13E234)",
"timeDelta" : 1739,
"memoryStatus" : {
"compressorSize" : 76679,
"pageSize" : 16384,
"compressions" : 2526427,
"memoryPages" : {
"active" : 24493,
"throttled" : 0,
"fileBacked" : 24113,
"wired" : 13007,
"anonymous" : 12915,
"purgeable" : 127,
"inactive" : 10955,
"free" : 2290,
"speculative" : 1580
},
"uncompressed" : 125795,
"decompressions" : 143684
},
"largestProcess" : "Facebook",
"processes" : [
{
...
{
"rpages" : 2050,
"states" : [
"frontmost",
"resume"
],
"name" : "KodiMusicRemoteP",
"pid" : 1518,
"reason" : "vm-thrashing",
"fds" : 50,
"uuid" : "5103a88a-917f-319e-8553-c0189dd1abac",
"purgeable" : 127,
"cpuTime" : 4.619693,
"lifetimeMax" : 3557
},
...
}
2. Нет предупреждений памяти
Я записываю предупреждения о нехватке памяти в файл журнала (через Cocoa Lumberjack), но в журнале моего тестировщика я не могу найти такой вывод журнала. Я протестировал код с моей тестовой функцией, и он работал нормально.
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
DDLogError(@"applicationDidReceiveMemoryWarning");
[DDLog flushLog];
// ... (do some other stuff, release memory)
}
3. Больше нигде не видел
Никто из других десяти бета-тестеров не сообщал об этой проблеме, и я не видел ее сам с моим iPhone 5S, который имеет половину памяти 6S.
4. Нет типичного сценария сбоя памяти
Мой тестер сообщил, что приложение иногда работает нормально в течение некоторого времени, но когда оно падает и он перезапускает его, оно часто снова быстро падает (например, через 10 секунд). Основываясь на архитектуре моего приложения, я не вижу, как утечка памяти может вызвать подобное поведение.
Спасибо за ваши идеи, Маркус