#android #out-of-memory
#Android #нехватка памяти
Вопрос:
Я разрабатываю приложение для Android, и теперь я обнаружил, что мое приложение отлично работает только на устройствах с API 22 и выше. На всех устройствах (виртуальных) с API менее 22 он выходит из строя (не отвечает) почти сразу после запуска. Я думаю, это происходит из-за нехватки памяти.
Если я посмотрю на вкладку Android Monitor (в Android Studio) на диаграмме «Память», я увижу это, и это
Похоже, что Android имеет достаточно памяти, но просто не успевает выделять
Как найти точное место в моем коде, где это происходит?
Журнал:
E/eglCodecCommon: writeFully: failed: Bad address
I/ActivityManager: Killing 1600:com.android.onetimeinitializer/u0a10 (adj 15): empty #17
W/libprocessgroup: failed to open /acct/uid_10010/pid_1600/cgroup.procs: No such file or directory
W/ActivityManager: Launch timeout has expired, giving up wake lock!
I/InputDispatcher: Application is not responding: Window{32b75f14 u0 .MainActivity}. It has been 5006.9ms since event, 5006.7ms since wait started. Reason: Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 11. Wait queue head age: 5549.6ms.
I/WindowManager: Input event dispatching timed out sending to .MainActivity. Reason: Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 11. Wait queue head age: 5549.6ms.
I/Process: Sending signal. PID: 1927 SIG: 3
I/art:Thread[5,tid=1934,WaitingInMainSignalCatcherLoop,Thread*=0xef70d400,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3
I/art: Wrote stack traces to '/data/anr/traces.txt'
I/Process: Sending signal. PID: 764 SIG: 3
I/art: Thread[5,tid=771,WaitingInMainSignalCatcherLoop,Thread*=0xef70d400,peer=0x12c02080,"Signal Catcher"]: reacting to signal 3
E/Sensors: Select fail, disconnect all clients (errno=4)
I/art: Wrote stack traces to '/data/anr/traces.txt'
I/Process: Sending signal. PID: 1081 SIG: 3
10-15 14:59:59.410 1081-1089/com.android.phone I/art: Thread[5,tid=1089,WaitingInMainSignalCatcherLoop,Thread*=0xef70d400,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3
I/art: Wrote stack traces to '/data/anr/traces.txt'
10-15 14:59:59.477 764-785/system_process I/Process: Sending signal. PID: 1050 SIG: 3
I/art: Thread[5,tid=1057,WaitingInMainSignalCatcherLoop,Thread*=0xef70d400,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3
I/art: Wrote stack traces to '/data/anr/traces.txt'
I/Process: Sending signal. PID: 868 SIG: 3
I/art: Thread[5,tid=876,WaitingInMainSignalCatcherLoop,Thread*=0xef70d400,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3
I/art: Wrote stack traces to '/data/anr/traces.txt'
I/art: Explicit concurrent mark sweep GC freed 39859(2MB) AllocSpace objects, 15(316KB) LOS objects, 33% free, 7MB/11MB, paused 367us total 18.175ms
E/ActivityManager: ANR in projectName
PID: 1927
Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 11. Wait queue head age: 5549.6ms.)
Load: 0.19 / 0.05 / 0.02
CPU usage from 9247ms to 0ms ago:
2.3% 125/adbd: 0.1% user 2.2% kernel / faults: 2072 minor
1.2% 764/system_server: 0.4% user 0.8% kernel / faults: 239 minor
1.1% 1927/prjectName: 0.8% user 0.3% kernel / faults: 731 minor
0.3% 303/local_opengl: 0% user 0.3% kernel
0% 301/vinput: 0% user 0% kernel
0.1% 1//init: 0% user 0.1% kernel / faults: 9 minor
0.1% 8/rcu_preempt: 0% user 0.1% kernel
0.1% 749/surfaceflinger: 0% user 0.1% kernel
0.1% 1112/com.android.launcher3: 0.1% user 0% kernel / faults: 377 minor
0.1% 1820/com.android.defcontainer: 0.1% user 0% kernel / faults: 200 minor
1.5% TOTAL: 0.3% user 1% kernel 0% softer
CPU usage from 1802ms to 2307ms later with 99% awake:
3.9% 764/system_server: 0% user 3.9% kernel / faults: 4 minor
1.4% TOTAL: 0.4% user 0.4% kernel 0.4% softirq
Комментарии:
1. Есть библиотека под названием LeakCanary. Никогда не использовал его, но видел, как он упоминался
2. Мы говорим о реальных устройствах? Не забывайте, что старые системы обычно сильно коррелируют с меньшим объемом памяти, поэтому трудно определить причину. Проверьте это в эмуляторе. При создании вашего AVD вы можете выбрать, сколько памяти вы ему предоставляете. Загрузите изображение API 16 или что-то с 4 или более ГБ, вы увидите, произойдет ли это по-прежнему.
3. Очень маловероятно, что это связано с памятью. Просто попробуйте отладить свое приложение на устройстве с более низким уровнем api. Также в журнале должна быть трассировка стека исключения, которое привело к сбою вашего приложения. Оно должно рассказать вам, в чем именно проблема.
Ответ №1:
Как найти точное место в моем коде, где это происходит? — Отладка!
После глубокой отладки, я думаю, я нашел, что было не так. Проблема заключалась в том, что я использовал пользовательский ImageView, и это заняло слишком много памяти, поэтому я постараюсь улучшить свой пользовательский ImageView.