[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/android/fix-memory-leaks":3,"mdc--sepoyz-key":327,"mdc--opawdj-key":338,"mdc--hz4zhx-key":346,"mdc--od7v3v-key":354,"mdc--ywsic-key":362,"mdc--s9cxtc-key":370,"mdc--e1tlcf-key":378,"mdc--t6s8gy-key":398,"mdc-ts6ynv-key":406,"related-/guides/android/fix-anr,/guides/android/optimize-app-performance,/guides/android/debug-heap":420,"mdc-78c76g-key":421},{"id":4,"title":5,"appliesTo":6,"author":10,"body":11,"canonical":259,"code":110,"createdAt":260,"description":261,"difficulty":262,"draft":263,"estimatedTime":264,"extension":265,"faq":266,"howToSteps":279,"howToTotalTime":296,"image":259,"keywords":297,"locale":306,"meta":307,"navigation":308,"path":309,"platform":310,"related":311,"section":315,"seo":316,"severity":110,"stem":317,"summary":318,"tags":319,"twitterCreator":259,"twitterSite":259,"type":325,"updatedAt":260,"__hash__":326},"content_ru/guides/android/fix-memory-leaks.md","Исправляем утечку памяти в Android: пошаговое руководство для разработчиков",[7,8,9],"Android 10 (API 29)","Android 12 (API 31)","Android 14 (API 33)","FixPedia Team",{"type":12,"value":13,"toc":245},"minimark",[14,19,23,26,30,59,63,68,71,75,78,82,94,97,101,104,145,148,152,155,159,166,170,177,181,234,241],[15,16,18],"h2",{"id":17},"введение-зачем-это-нужно","Введение / Зачем это нужно",[20,21,22],"p",{},"Утечка памяти — это распространённая проблема, которая медленно, но верно снижает производительность Android-устройств, вызывает задержки и accelerates разрядку батареи. Если не решать её, со временем приложение может аварийно завершиться из-за нехватки памяти.",[20,24,25],{},"В этом гайде вы узнаете, как быстро выявить основные причины утечек (неправильное управление жизненным циклом, статические ссылки, накопление объектов View) и устранить их с помощью встроенных инструментов Android Studio и популярной библиотеки LeakCanary. После выполнения инструкции вы сможете самостоятельно диагностировать и исправлять типичные утечки в своём коде.",[15,27,29],{"id":28},"требования-подготовка","Требования / Подготовка",[31,32,33,41,47,53],"ul",{},[34,35,36,40],"li",{},[37,38,39],"strong",{},"Android Studio"," (версия 2023.2 или выше).",[34,42,43,46],{},[37,44,45],{},"Устройство или эмулятор"," с включённой отладкой по USB.",[34,48,49,52],{},[37,50,51],{},"Android SDK Platform"," версии, соответствующей целевой API (например, API 33).",[34,54,55,58],{},[37,56,57],{},"Проект на Kotlin или Java"," (минимальная версия Gradle — 7.0).",[15,60,62],{"id":61},"пошаговая-инструкция","Пошаговая инструкция",[64,65,67],"h3",{"id":66},"шаг-1-подключите-устройство-или-эмулятор","Шаг 1: Подключите устройство или эмулятор",[20,69,70],{},"Подключите Android-устройство через USB или запустите эмулятор в Android Studio. Убедитесь, что включено отладка по USB (Настройки → О телефоне → Номер сборки) и на компьютере установлен драйвер устройства.",[64,72,74],{"id":73},"шаг-2-запустите-android-profiler","Шаг 2: Запустите Android Profiler",[20,76,77],{},"В Android Studio откройте окно Profiler (View → Tool Windows → Profiler). Выберите своё устройство, перейдите во вкладку «Memory», нажмите «Record». Выполните действия в приложении, которые вызывают утечку, затем остановите запись.",[64,79,81],{"id":80},"шаг-3-используйте-leakcanary-для-автоматического-обнаружения","Шаг 3: Используйте LeakCanary для автоматического обнаружения",[20,83,84,85,89,90,93],{},"Добавьте в проект зависимость ",[86,87,88],"code",{},"leakcanary-android",". В тестовом Activity или методе, где подозреваете утечку, создайте ",[86,91,92],{},"RefWatcher",". Запустите тестовый запуск — LeakCanary покажет, какие объекты удерживаются дольше needed.",[95,96],"in-article-ad",{},[64,98,100],{"id":99},"шаг-4-включите-strictmode-для-выявления-сетевых-операций","Шаг 4: Включите StrictMode для выявления сетевых операций",[20,102,103],{},"Добавьте в код следующее:",[105,106,111],"pre",{"className":107,"code":108,"language":109,"meta":110,"style":110},"language-kotlin shiki shiki-themes github-light github-dark","val strictModePolicy = object : StrictMode.ThreadPolicy.Builder()\n    .detectAll()\n    .penaltyLog()\n    .build()\nStrictMode.setThreadPolicy(strictModePolicy)\n","kotlin","",[86,112,113,121,127,133,139],{"__ignoreMap":110},[114,115,118],"span",{"class":116,"line":117},"line",1,[114,119,120],{},"val strictModePolicy = object : StrictMode.ThreadPolicy.Builder()\n",[114,122,124],{"class":116,"line":123},2,[114,125,126],{},"    .detectAll()\n",[114,128,130],{"class":116,"line":129},3,[114,131,132],{},"    .penaltyLog()\n",[114,134,136],{"class":116,"line":135},4,[114,137,138],{},"    .build()\n",[114,140,142],{"class":116,"line":141},5,[114,143,144],{},"StrictMode.setThreadPolicy(strictModePolicy)\n",[20,146,147],{},"Запустите приложение в режиме отладки; нежелательные сетевые операции или блокирующие вызовы будут отображаться в логах.",[64,149,151],{"id":150},"шаг-5-очистите-кэш-и-перезапустите-процесс","Шаг 5: Очистите кэш и перезапустите процесс",[20,153,154],{},"В настройках разработчика устройства откройте пункт «Очистить память приложения». Перезапустите приложение, чтобы убедиться, что временные данные не накапливаются повторно.",[64,156,158],{"id":157},"шаг-6-проанализируйте-данные-и-внесите-изменения","Шаг 6: Проанализируйте данные и внесите изменения",[20,160,161,162,165],{},"В окне Profiler изучите графики «Heap size» и «Allocated objects». Найдите объекты, которые остаются после завершения активности, удалите ненужные ссылки или используйте ",[86,163,164],{},"WeakReference",". Перестройте код и повторите тест.",[15,167,169],{"id":168},"проверка-результата","Проверка результата",[20,171,172,173,176],{},"После внесения изменений запустите приложение и повторите те же действия, которые ранее вызывали утечку. Откройте Profiler снова и убедитесь, что графики «Heap size» возвращаются к baseline значению после завершения работы. LeakCanary также должен перестать отображать обнаруженные утечки. Если проблемы сохраняются, проверьте статические коллекции, фоновые сервисы и корректность ",[86,174,175],{},"View","‑связей.",[15,178,180],{"id":179},"возможные-проблемы","Возможные проблемы",[31,182,183,201,214,220],{},[34,184,185,188,189,192,193,196,197,200],{},[37,186,187],{},"Activity остаётся в памяти после переключения на другой экран"," – убедитесь, что вызываете ",[86,190,191],{},"onDestroy","/",[86,194,195],{},"onPause"," и очищаете ссылки (",[86,198,199],{},"activity = null",").",[34,202,203,206,207,209,210,213],{},[37,204,205],{},"Статические списки удерживают объекты"," – используйте ",[86,208,164],{}," или ",[86,211,212],{},"SparseArray"," с правильным управлением жизненным циклом.",[34,215,216,219],{},[37,217,218],{},"LeakCanary не работает в продакшене"," – библиотека отключена в release-сборках; используйте для тестирования или эмуляции.",[34,221,222,225,226,229,230,233],{},[37,223,224],{},"StrictMode генерирует много логов"," – ограничьте его определёнными нарушениями (",[86,227,228],{},"detectNetwork()",", ",[86,231,232],{},"detectCustomSlowCalls()",") для фокуса на критичных проблемах.",[20,235,236,237,240],{},"Если эти советы не помогают, проверьте использование ",[86,238,239],{},"WorkManager"," и фоновых служб, особенно на устройствах под Android 12+, где stricter ограничения на фоновую работу могут имитировать утечки.",[242,243,244],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":110,"searchDepth":123,"depth":123,"links":246},[247,248,249,257,258],{"id":17,"depth":123,"text":18},{"id":28,"depth":123,"text":29},{"id":61,"depth":123,"text":62,"children":250},[251,252,253,254,255,256],{"id":66,"depth":129,"text":67},{"id":73,"depth":129,"text":74},{"id":80,"depth":129,"text":81},{"id":99,"depth":129,"text":100},{"id":150,"depth":129,"text":151},{"id":157,"depth":129,"text":158},{"id":168,"depth":123,"text":169},{"id":179,"depth":123,"text":180},null,"2026-07-13 08:57:55","Выявите и устраните утечку памяти в Android-приложениях за 10 минут. Пошаговое руководство с инструментами Android Studio и LeakCanary.","medium",false,"10-15 мин","md",[267,270,273,276],{"question":268,"answer":269},"Почему в Android-приложении происходит утечка памяти?","Чаще всего это происходит из-за хранения ссылок в статических коллекциях, неправильного управления жизненным циклом Activity и утечек объектов View. Android Studio Profiler и LeakCanary помогут выявить истинную причину.",{"question":271,"answer":272},"Как предотвратить утечку памяти в будущем?","Используйте LeakCanary в тестовом режиме, отслеживайте размер кучи через Android Profiler, освобождайте ресурсы в onDestroy, избегайте статических ссылок и используйте ViewBinding вместо findViewById.",{"question":274,"answer":275},"Что делать, если утечка возникает только на Android 12?","Проверьте использование WorkManager и фоновых служб, так как начиная с Android 12 stricter ограничения на фоновую работу могут вызывать накопление объектов.",{"question":277,"answer":278},"Есть ли бесплатный инструмент для выявления утечек?","Да — LeakCanary (бесплатная библиотека) и встроенный Android Studio Profiler предоставляют подробную информацию о размерах кучи без дополнительной платы.",[280,282,285,288,291,293],{"name":281,"text":70},"Подключите устройство или эмулятор",{"name":283,"text":284},"Запустите Android Profiler","В Android Studio откройте окно Profiler (View → Tool Windows → Profiler). Выберите свое устройство, перейдите во вкладку «Memory», нажмите «Record». Выполните действия в приложении, которые вызывают утечку, затем остановите запись.",{"name":286,"text":287},"Используйте LeakCanary для автоматического обнаружения","Добавьте в проект зависимость `leakcanary-android`. В тестовом Activity или методе, где подозреваете утечку, создайте `RefWatcher`. Запустите тестовый запуск — LeakCanary покажет, какие объекты удерживаются дольше needed.",{"name":289,"text":290},"Включите StrictMode для выявления сетевых операций","Добавьте в код следующее:\n\n```kotlin\nval strictModePolicy = object : StrictMode.ThreadPolicy.Builder()\n    .detectAll()\n    .penaltyLog()\n    .build()\nStrictMode.setThreadPolicy(strictModePolicy)\n```\nЗапустите приложение в режиме отладки; нежелательные сетевые операции или блокирующие вызовы будут отображаться в логах.",{"name":292,"text":154},"Очистите кэш и перезапустите процесс",{"name":294,"text":295},"Проанализируйте данные и внесите изменения","В окне Profiler изучите графики «Heap size» и «Allocated objects». Найдите объекты, которые остаются после завершения активности, удалите ненужные ссылки или используйте `WeakReference`. Перестройте код и повторите тест.","PT15M",[298,299,300,301,302,303,304,305],"утечка памяти android","leak memory android","android memory leak detection","Android Studio Profiler memory leak","как исправить утечку памяти в андроиде","LeakCanary android","android heap memory leak","android strictmode memory","ru_RU",{},true,"/guides/android/fix-memory-leaks","android",[312,313,314],"/guides/android/fix-anr","/guides/android/optimize-app-performance","/guides/android/debug-heap","Гайды Android",{"title":5,"description":261},"guides/android/fix-memory-leaks","Утечка памяти снижает производительность Android-устройств и ускоряет износ батареи. В этом гайде вы узнаете, как быстро найти и исправить основные причины утечек с помощью встроенных инструментов и популярных библиотек.",[320,321,322,323,39,324],"Android","memory leak","debugging","performance","Kotlin","guide","EfbY7D1wTBrdoM4YmRUUS-GVjMom3l6MN8rs7E_crIA",{"data":328,"body":329},{},{"type":330,"children":331},"root",[332],{"type":333,"tag":20,"props":334,"children":335},"element",{},[336],{"type":337,"value":269},"text",{"data":339,"body":340},{},{"type":330,"children":341},[342],{"type":333,"tag":20,"props":343,"children":344},{},[345],{"type":337,"value":272},{"data":347,"body":348},{},{"type":330,"children":349},[350],{"type":333,"tag":20,"props":351,"children":352},{},[353],{"type":337,"value":275},{"data":355,"body":356},{},{"type":330,"children":357},[358],{"type":333,"tag":20,"props":359,"children":360},{},[361],{"type":337,"value":278},{"data":363,"body":364},{},{"type":330,"children":365},[366],{"type":333,"tag":20,"props":367,"children":368},{},[369],{"type":337,"value":70},{"data":371,"body":372},{},{"type":330,"children":373},[374],{"type":333,"tag":20,"props":375,"children":376},{},[377],{"type":337,"value":284},{"data":379,"body":380},{},{"type":330,"children":381},[382],{"type":333,"tag":20,"props":383,"children":384},{},[385,386,391,392,397],{"type":337,"value":84},{"type":333,"tag":86,"props":387,"children":389},{"className":388},[],[390],{"type":337,"value":88},{"type":337,"value":89},{"type":333,"tag":86,"props":393,"children":395},{"className":394},[],[396],{"type":337,"value":92},{"type":337,"value":93},{"data":399,"body":400},{},{"type":330,"children":401},[402],{"type":333,"tag":20,"props":403,"children":404},{},[405],{"type":337,"value":154},{"data":407,"body":408},{},{"type":330,"children":409},[410],{"type":333,"tag":20,"props":411,"children":412},{},[413,414,419],{"type":337,"value":161},{"type":333,"tag":86,"props":415,"children":417},{"className":416},[],[418],{"type":337,"value":164},{"type":337,"value":165},[],{"data":422,"body":423},{},{"type":330,"children":424},[425,429,438,442],{"type":333,"tag":20,"props":426,"children":427},{},[428],{"type":337,"value":103},{"type":333,"tag":105,"props":430,"children":433},{"className":431,"code":108,"language":109,"meta":110,"style":432},"language-kotlin","undefined",[434],{"type":333,"tag":86,"props":435,"children":436},{"__ignoreMap":110},[437],{"type":337,"value":108},{"type":333,"tag":20,"props":439,"children":440},{},[441],{"type":337,"value":147},{"type":333,"tag":242,"props":443,"children":444},{},[445],{"type":337,"value":110}]