[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/errors/android/outofmemory":3,"mdc--6yu5re-key":856,"mdc-lpbshv-key":866,"mdc-q7s2dr-key":874,"mdc-7v3qqb-key":882,"mdc--b9lbw9-key":890,"mdc-is2vku-key":898,"mdc--wiseo-key":906,"mdc--hvuh5t-key":914,"mdc--x7y253-key":922,"related-/errors/android/storagefull,/guides/android/memory-profiling,/errors/java/outofmemoryerror":937},{"id":4,"title":5,"appliesTo":6,"author":9,"body":10,"canonical":787,"code":28,"createdAt":788,"description":789,"difficulty":790,"draft":791,"estimatedTime":792,"extension":793,"faq":794,"howToSteps":807,"howToTotalTime":823,"image":787,"keywords":824,"locale":835,"meta":836,"navigation":837,"path":838,"platform":839,"related":840,"section":844,"seo":845,"severity":846,"stem":847,"summary":848,"tags":849,"twitterCreator":787,"twitterSite":787,"type":854,"updatedAt":788,"__hash__":855},"content_ru/errors/android/outofmemory.md","OutOfMemoryError в Android: причины и способы исправления",[7,8],"Android 5.0 (API 21) и выше","Приложения на Java/Kotlin","FixPedia Team",{"type":11,"value":12,"toc":773},"minimark",[13,18,30,41,44,48,51,131,135,140,146,203,224,228,235,241,256,263,302,334,339,347,391,415,419,424,436,461,474,508,515,536,544,548,555,566,588,601,605,608,635,644,673,676,680,683,725,729,732,763,769],[14,15,17],"h2",{"id":16},"что-означает-ошибка-outofmemoryerror","Что означает ошибка OutOfMemoryError",[19,20,21,25,26,29],"p",{},[22,23,24],"strong",{},"OutOfMemoryError"," (часто сокращенно ",[22,27,28],{},"OOM",") — это критическая ошибка времени выполнения в Java и Android, которая возникает, когда виртуальная машина (ART на Android) не может выделить объект в куче (heap) из-за нехватки памяти. Ошибка обычно выглядит так:",[31,32,37],"pre",{"className":33,"code":35,"language":36},[34],"language-text","java.lang.OutOfMemoryError: Failed to allocate a 123456-byte allocation with 12345 free bytes and 12MB until OOM\n","text",[38,39,35],"code",{"__ignoreMap":40},"",[19,42,43],{},"Она приводит к немедленному падению приложения. В Android эта ошибка особенно распространена на устройствах с ограниченной памятью (например, бюджетные модели) или при работе с большими ресурсами (изображения, JSON-ответы, кэши).",[14,45,47],{"id":46},"причины-возникновения","Причины возникновения",[19,49,50],{},"OutOfMemoryError не случается случайно. Вот наиболее частые причины:",[52,53,54,61,75,81,95,115,125],"ol",{},[55,56,57,60],"li",{},[22,58,59],{},"Утечки памяти (memory leaks)"," — объекты, которые больше не нужны, но продолжают удерживаться в памяти (например, через статические ссылки, незакрытые слушатели, контекст активности в фоновых задачах).",[55,62,63,66,67,70,71,74],{},[22,64,65],{},"Загрузка слишком больших изображений"," — без должного масштабирования или сжатия, особенно при использовании ",[38,68,69],{},"BitmapFactory.decode*"," без указания ",[38,72,73],{},"inSampleSize",".",[55,76,77,80],{},[22,78,79],{},"Слишком большой размер кучи (heap)"," — приложение пытается создать объект, который физически не помещается в доступную память (например, огромный массив или список).",[55,82,83,86,87,90,91,94],{},[22,84,85],{},"Неэффективные структуры данных"," — использование ",[38,88,89],{},"HashMap"," или ",[38,92,93],{},"ArrayList"," без ограничения роста, хранение дублирующих данных.",[55,96,97,100,101,104,105,104,108,104,111,114],{},[22,98,99],{},"Неосвобождаемые ресурсы"," — незакрытые ",[38,102,103],{},"Cursor",", ",[38,106,107],{},"InputStream",[38,109,110],{},"OutputStream",[38,112,113],{},"Socket",", которые держат память и файловые дескрипторы.",[55,116,117,120,121,124],{},[22,118,119],{},"Избыточное кэширование"," — хранение в кэше (например, ",[38,122,123],{},"LruCache",") слишком много объектов или объектов большого размера.",[55,126,127,130],{},[22,128,129],{},"Работа с большими JSON/XML"," — парсинг огромных строк в объекты без потокового подхода.",[14,132,134],{"id":133},"способы-решения","Способы решения",[136,137,139],"h3",{"id":138},"способ-1-анализ-памяти-и-обнаружение-утечек","Способ 1: Анализ памяти и обнаружение утечек",[19,141,142,143,74],{},"Первым делом нужно понять, что именно потребляет память. Android Studio предоставляет мощный инструмент — ",[22,144,145],{},"Memory Profiler",[52,147,148,151,154,165,171,178,189,192],{},[55,149,150],{},"Откройте проект в Android Studio.",[55,152,153],{},"Запустите приложение на устройстве или эмуляторе.",[55,155,156,157,160,161,164],{},"В меню выберите ",[22,158,159],{},"View → Tool Windows → Profiler"," (или нажмите ",[38,162,163],{},"Alt+Shift+F10",").",[55,166,167,168,74],{},"В окне Profiler выберите ваше устройство и приложение, затем перейдите на вкладку ",[22,169,170],{},"Memory",[55,172,173,174,177],{},"Нажмите кнопку ",[22,175,176],{},"Record"," (кружок) и выполните действия, которые обычно приводят к падению (например, открыть экран с изображениями, прокрутить список).",[55,179,180,181,184,185,188],{},"После появления роста памяти нажмите ",[22,182,183],{},"Pause",", затем ",[22,186,187],{},"Dump Java heap"," (значок камеры). Откроется окно с анализом кучи.",[55,190,191],{},"В левой панели найдите подозрительные классы (например, ваши Activity, Fragment, Bitmap) и проверьте количество экземпляров. Если объекты не освобождаются после выхода из экрана — это утечка.",[55,193,194,195,198,199,202],{},"Для детального анализа используйте ",[22,196,197],{},"Analyzer Tasks"," → ",[22,200,201],{},"Find Leaks",". Профилировщик покажет цепочки ссылок, удерживающие объекты.",[204,205,206],"blockquote",{},[19,207,208,209,212,213,216,217,220,221,223],{},"💡 ",[22,210,211],{},"Совет",": Обратите внимание на ",[38,214,215],{},"Activity"," и ",[38,218,219],{},"Context"," — самые частые виновники утечек. Если в статическом поле или в долгоживущем объекте (например, синглтоне) хранится ссылка на ",[38,222,215],{},", она не будет собрана сборщиком мусора.",[136,225,227],{"id":226},"способ-2-оптимизация-работы-с-изображениями","Способ 2: Оптимизация работы с изображениями",[19,229,230,231,234],{},"Изображения — самая частая причина OOM. Даже небольшое ",[38,232,233],{},"Bitmap"," в памяти занимает в 4-8 раз больше места, чем на диске (из-за ARGB_8888).",[19,236,237,240],{},[22,238,239],{},"Используйте библиотеки для загрузки изображений"," (Glide, Picasso, Coil). Они автоматически:",[242,243,244,250,253],"ul",{},[55,245,246,247,74],{},"Масштабируют изображение под размер ",[38,248,249],{},"ImageView",[55,251,252],{},"Кэшируют в памяти и на диске.",[55,254,255],{},"Управляют жизненным циклом (отменяют загрузку при уничтожении Activity).",[19,257,258,259,262],{},"Пример с ",[22,260,261],{},"Glide",":",[31,264,268],{"className":265,"code":266,"language":267,"meta":40,"style":40},"language-gradle shiki shiki-themes github-light github-dark","// build.gradle (Module)\ndependencies {\n    implementation 'com.github.bumptech.glide:glide:4.15.1'\n    annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'\n}\n","gradle",[38,269,270,278,284,290,296],{"__ignoreMap":40},[271,272,275],"span",{"class":273,"line":274},"line",1,[271,276,277],{},"// build.gradle (Module)\n",[271,279,281],{"class":273,"line":280},2,[271,282,283],{},"dependencies {\n",[271,285,287],{"class":273,"line":286},3,[271,288,289],{},"    implementation 'com.github.bumptech.glide:glide:4.15.1'\n",[271,291,293],{"class":273,"line":292},4,[271,294,295],{},"    annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1'\n",[271,297,299],{"class":273,"line":298},5,[271,300,301],{},"}\n",[31,303,307],{"className":304,"code":305,"language":306,"meta":40,"style":40},"language-kotlin shiki shiki-themes github-light github-dark","// Загрузка с автоматическим масштабированием\nGlide.with(context)\n    .load(imageUrl)\n    .override(targetWidth, targetHeight) // опционально: явное указание размера\n    .into(imageView)\n","kotlin",[38,308,309,314,319,324,329],{"__ignoreMap":40},[271,310,311],{"class":273,"line":274},[271,312,313],{},"// Загрузка с автоматическим масштабированием\n",[271,315,316],{"class":273,"line":280},[271,317,318],{},"Glide.with(context)\n",[271,320,321],{"class":273,"line":286},[271,322,323],{},"    .load(imageUrl)\n",[271,325,326],{"class":273,"line":292},[271,327,328],{},"    .override(targetWidth, targetHeight) // опционально: явное указание размера\n",[271,330,331],{"class":273,"line":298},[271,332,333],{},"    .into(imageView)\n",[19,335,336,262],{},[22,337,338],{},"Если библиотеки не используются",[242,340,341],{},[55,342,343,344,346],{},"Всегда указывайте ",[38,345,73],{}," при декодировании:",[31,348,352],{"className":349,"code":350,"language":351,"meta":40,"style":40},"language-java shiki shiki-themes github-light github-dark","BitmapFactory.Options options = new BitmapFactory.Options();\noptions.inJustDecodeBounds = true;\nBitmapFactory.decodeStream(is, null, options);\n// Вычисляем inSampleSize на основе требуемых размеров\noptions.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);\noptions.inJustDecodeBounds = false;\nBitmap bitmap = BitmapFactory.decodeStream(is, null, options);\n","java",[38,353,354,359,364,369,374,379,385],{"__ignoreMap":40},[271,355,356],{"class":273,"line":274},[271,357,358],{},"BitmapFactory.Options options = new BitmapFactory.Options();\n",[271,360,361],{"class":273,"line":280},[271,362,363],{},"options.inJustDecodeBounds = true;\n",[271,365,366],{"class":273,"line":286},[271,367,368],{},"BitmapFactory.decodeStream(is, null, options);\n",[271,370,371],{"class":273,"line":292},[271,372,373],{},"// Вычисляем inSampleSize на основе требуемых размеров\n",[271,375,376],{"class":273,"line":298},[271,377,378],{},"options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);\n",[271,380,382],{"class":273,"line":381},6,[271,383,384],{},"options.inJustDecodeBounds = false;\n",[271,386,388],{"class":273,"line":387},7,[271,389,390],{},"Bitmap bitmap = BitmapFactory.decodeStream(is, null, options);\n",[242,392,393,400],{},[55,394,395,396,399],{},"Используйте ",[38,397,398],{},"Bitmap.Config.RGB_565"," (2 байта на пиксель вместо 4), если альфа-канал не нужен.",[55,401,402,403,406,407,410,411,414],{},"Явно вызывайте ",[38,404,405],{},"bitmap.recycle()"," (для API \u003C 28) или присваивайте ",[38,408,409],{},"null"," и вызывайте ",[38,412,413],{},"System.gc()"," (не гарантирует, но иногда помогает).",[136,416,418],{"id":417},"способ-3-правильное-управление-ресурсами-и-жизненным-циклом","Способ 3: Правильное управление ресурсами и жизненным циклом",[19,420,421,422,74],{},"Многие утечки возникают из-за того, что ресурсы не закрываются, или фоновые задачи держат ссылку на ",[38,423,215],{},[52,425,426],{},[55,427,428,431,432,435],{},[22,429,430],{},"Закрывайте все ресурсы"," в ",[38,433,434],{},"finally","-блоках или используйте try-with-resources (Java 7+):",[31,437,439],{"className":349,"code":438,"language":351,"meta":40,"style":40},"try (Cursor cursor = db.rawQuery(...);\n     InputStream is = ...) {\n    // работа\n} // автоматически закроется\n",[38,440,441,446,451,456],{"__ignoreMap":40},[271,442,443],{"class":273,"line":274},[271,444,445],{},"try (Cursor cursor = db.rawQuery(...);\n",[271,447,448],{"class":273,"line":280},[271,449,450],{},"     InputStream is = ...) {\n",[271,452,453],{"class":273,"line":286},[271,454,455],{},"    // работа\n",[271,457,458],{"class":273,"line":292},[271,459,460],{},"} // автоматически закроется\n",[52,462,463],{"start":280},[55,464,465,431,468,90,471,262],{},[22,466,467],{},"Отменяйте фоновые задачи",[38,469,470],{},"onDestroy()",[38,472,473],{},"onStop()",[31,475,477],{"className":304,"code":476,"language":306,"meta":40,"style":40},"override fun onDestroy() {\n    super.onDestroy()\n    job.cancel() // для корутин\n    call.cancel() // для Retrofit\n    handler.removeCallbacksAndMessages(null)\n}\n",[38,478,479,484,489,494,499,504],{"__ignoreMap":40},[271,480,481],{"class":273,"line":274},[271,482,483],{},"override fun onDestroy() {\n",[271,485,486],{"class":273,"line":280},[271,487,488],{},"    super.onDestroy()\n",[271,490,491],{"class":273,"line":286},[271,492,493],{},"    job.cancel() // для корутин\n",[271,495,496],{"class":273,"line":292},[271,497,498],{},"    call.cancel() // для Retrofit\n",[271,500,501],{"class":273,"line":298},[271,502,503],{},"    handler.removeCallbacksAndMessages(null)\n",[271,505,506],{"class":273,"line":381},[271,507,301],{},[52,509,510],{"start":286},[55,511,512,262],{},[22,513,514],{},"Избегайте неявных ссылок на Context",[242,516,517,523,529],{},[55,518,519,520,522],{},"Не храните ",[38,521,219],{}," в статических полях.",[55,524,395,525,528],{},[38,526,527],{},"applicationContext"," там, где не нужен UI-контекст.",[55,530,531,532,535],{},"В фрагментах и активностях используйте ",[38,533,534],{},"viewLifecycleOwner"," для жизненного цикла.",[52,537,538],{"start":292},[55,539,540,543],{},[22,541,542],{},"Используйте слабые ссылки (WeakReference)"," для кэшей, которые могут содержать контекст.",[136,545,547],{"id":546},"способ-4-увеличение-размера-кучи-временное-решение","Способ 4: Увеличение размера кучи (временное решение)",[19,549,550,551,554],{},"Если оптимизации не помогают, а приложение критически важно, можно ",[22,552,553],{},"временно"," увеличить лимит памяти.",[19,556,557,558,561,562,565],{},"В ",[38,559,560],{},"AndroidManifest.xml"," в теге ",[38,563,564],{},"\u003Capplication>"," добавьте:",[31,567,571],{"className":568,"code":569,"language":570,"meta":40,"style":40},"language-xml shiki shiki-themes github-light github-dark","\u003Capplication\n    android:largeHeap=\"true\"\n    ... >\n","xml",[38,572,573,578,583],{"__ignoreMap":40},[271,574,575],{"class":273,"line":274},[271,576,577],{},"\u003Capplication\n",[271,579,580],{"class":273,"line":280},[271,581,582],{},"    android:largeHeap=\"true\"\n",[271,584,585],{"class":273,"line":286},[271,586,587],{},"    ... >\n",[204,589,590],{},[19,591,592,593,596,597,600],{},"⚠️ ",[22,594,595],{},"Важно",": Это не панацея. ",[38,598,599],{},"largeHeap"," увеличивает лимит только на некоторых устройствах (обычно в 2-3 раза), но не снимает проблему утечек. Используйте только как временную меру, пока не исправите коренную причину. На новых версиях Android (особенно с ограничениями в фоновом режиме) этот атрибут может игнорироваться.",[14,602,604],{"id":603},"профилактика","Профилактика",[19,606,607],{},"Чтобы избежать OutOfMemoryError в будущем:",[52,609,610,616,629],{},[55,611,612,615],{},[22,613,614],{},"Регулярно профилируйте память"," — добавьте Memory Profiler в процесс разработки, особенно перед releasing.",[55,617,618,621,622,216,625,628],{},[22,619,620],{},"Используйте статический анализ"," — инструменты вроде ",[22,623,624],{},"Android Lint",[22,626,627],{},"SonarQube"," могут выявить потенциальные утечки.",[55,630,631,634],{},[22,632,633],{},"Внедрите LeakCanary"," — библиотека автоматически обнаруживает утечки в debug-сборках:",[31,636,638],{"className":265,"code":637,"language":267,"meta":40,"style":40},"debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.12'\n",[38,639,640],{"__ignoreMap":40},[271,641,642],{"class":273,"line":274},[271,643,637],{},[52,645,646,655,667],{"start":292},[55,647,648,651,652,654],{},[22,649,650],{},"Ограничивайте размеры коллекций"," — используйте ",[38,653,123],{}," для кэширования, задавайте лимиты спискам.",[55,656,657,660,661,90,664,74],{},[22,658,659],{},"Обрабатывайте большие данные потоково"," — не загружайте весь JSON/файл в память, используйте ",[38,662,663],{},"JsonReader",[38,665,666],{},"XmlPullParser",[55,668,669,672],{},[22,670,671],{},"Тестируйте на устройствах с малым объемом RAM"," — emulateur с 512MB или реальные бюджетные телефоны.",[674,675],"in-article-ad",{},[136,677,679],{"id":678},"способ-n-использование-статических-анализаторов-и-ci","Способ N: Использование статических анализаторов и CI",[19,681,682],{},"Для сложных проектов автоматизируйте поиск утечек:",[52,684,685,691,697],{},[55,686,687,690],{},[22,688,689],{},"Интегрируйте LeakCanary в CI"," (например, с Firebase Test Lab) — запускайте тесты на устройствах и проверяйте отчеты.",[55,692,693,696],{},[22,694,695],{},"Используйте Perfetto"," — системный трейсер Android, который может выявить проблемы с памятью на уровне системы.",[55,698,699,702,703],{},[22,700,701],{},"Проводите регулярный аудит кода"," на предмет:\n",[242,704,705,714,719],{},[55,706,707,708,710,711,74],{},"Статических ссылок на ",[38,709,219],{},"/",[38,712,713],{},"View",[55,715,716,717,74],{},"Незакрытых ресурсов в ",[38,718,434],{},[55,720,721,722,74],{},"Регистрации слушателей без соответствующих ",[38,723,724],{},"unregister",[14,726,728],{"id":727},"профилактика-дополнительно","Профилактика (дополнительно)",[19,730,731],{},"Помимо вышеперечисленного, следите за:",[242,733,734,740,746],{},[55,735,736,739],{},[22,737,738],{},"Размером APK"," — большие ресурсы (未 сжатые изображения, аудио) могут привести к OOM при первом запуске.",[55,741,742,745],{},[22,743,744],{},"Количеством процессов"," — на устройствах с Android 8+ ограничено количество фоновых процессов. Избыточные сервисы могут привести к нехватке памяти.",[55,747,748,751,752,104,755,758,759,762],{},[22,749,750],{},"Адаптацией под разные плотности экрана"," — загружайте только нужные ресурсы (",[38,753,754],{},"drawable-hdpi",[38,756,757],{},"xhdpi"," и т.д.) через ",[38,760,761],{},"Resources.getIdentifier()"," или CDN.",[19,764,765,768],{},[22,766,767],{},"Заключительный совет",": Начните с профилирования — 90% проблем OOM находятся в первые 10 минут анализа Memory Profiler. Не игнорируйте предупреждения Lint о утечках, они часто точечны.",[770,771,772],"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":40,"searchDepth":280,"depth":280,"links":774},[775,776,777,783,786],{"id":16,"depth":280,"text":17},{"id":46,"depth":280,"text":47},{"id":133,"depth":280,"text":134,"children":778},[779,780,781,782],{"id":138,"depth":286,"text":139},{"id":226,"depth":286,"text":227},{"id":417,"depth":286,"text":418},{"id":546,"depth":286,"text":547},{"id":603,"depth":280,"text":604,"children":784},[785],{"id":678,"depth":286,"text":679},{"id":727,"depth":280,"text":728},null,"2026-02-15 17:09:45","Подробное руководство по устранению ошибки OutOfMemoryError в Android. Пошаговые инструкции по анализу памяти, оптимизации изображений и управлению ресурсами. Решите проблему за 30 минут!","medium",false,"15-30 мин","md",[795,798,801,804],{"answer":796,"question":797},"OutOfMemoryError возникает, когда приложение пытается выделить память, но виртуальная машина Java (ART) не может предоставить достаточный объем из-за нехватки доступной памяти в куче (heap) или ограничений системы.","Что вызывает OutOfMemoryError в Android?",{"answer":799,"question":800},"Для профилактики используйте эффективные структуры данных, избегайте утечек памяти, правильно управляйте ресурсами (например, закрывайте потоки и курсоры), и используйте кэширование с осторожностью.","Как предотвратить OutOfMemoryError?",{"answer":802,"question":803},"Потому что у каждого приложения есть лимит на размер кучи (heap), который зависит от устройства и версии Android. Даже если на устройстве много свободной памяти, приложение не может превысить свой лимит.","Почему приложение падает с OutOfMemoryError, хотя свободной памяти на устройстве много?",{"answer":805,"question":806},"Используйте Android Studio Profiler (Memory Profiler) для отслеживания выделения памяти и обнаружения утечек.","Как измерить использование памяти в приложении?",[808,811,814,817,820],{"name":809,"text":810},"Анализ памяти с помощью Memory Profiler","Запустите Memory Profiler в Android Studio, начните запись и выполните действия, которые вызывают проблему. Затем сделайте heap dump и найдите объекты, которые не освобождаются.",{"name":812,"text":813},"Оптимизация загрузки изображений","Используйте библиотеки вроде Glide или Picasso для загрузки изображений, которые автоматически управляют памятью и кэшированием. Избегайте загрузки полных размеров, если не нужно.",{"name":815,"text":816},"Обнаружение утечек памяти","Добавьте библиотеку LeakCanary в проект, которая автоматически обнаруживает утечки памяти и показывает трейс.",{"name":818,"text":819},"Освобождение ресурсов","Убедитесь, что в методах жизненного цикла (onDestroy, onStop) вы закрываете все ресурсы: потоки, курсоры, базы данных.",{"name":821,"text":822},"Увеличение размера кучи (временное решение)","В файле AndroidManifest.xml в теге \u003Capplication> добавьте атрибут android:largeHeap=\"true\", чтобы увеличить лимит памяти для приложения.","PT45M",[825,826,827,828,829,830,831,832,833,834],"OutOfMemoryError Android","ошибка OutOfMemoryError","как исправить OutOfMemoryError","Android утечка памяти","OOM ошибка Android","приложение вылетает OutOfMemoryError","нехватка памяти Android","исправление OutOfMemoryError","Android память","ошибка памяти в Android","ru_RU",{},true,"/errors/android/outofmemory","android",[841,842,843],"/errors/android/storagefull","/guides/android/memory-profiling","/errors/java/outofmemoryerror","Ошибки Android",{"title":5,"description":789},"critical","errors/android/outofmemory","OutOfMemoryError возникает, когда приложение исчерпает лимит памяти. В статье разберем основные причины и дадим проверенные способы исправления, включая использование Memory Profiler и оптимизацию загрузки изображений.",[844,850,851,28,852,853],"Android","Память","memory leak","Java","error","FnBdNYlNW6Q7tLl0V7u96TeO6HlAV0ydv18S_20hkow",{"data":857,"body":858},{},{"type":859,"children":860},"root",[861],{"type":862,"tag":19,"props":863,"children":864},"element",{},[865],{"type":36,"value":796},{"data":867,"body":868},{},{"type":859,"children":869},[870],{"type":862,"tag":19,"props":871,"children":872},{},[873],{"type":36,"value":799},{"data":875,"body":876},{},{"type":859,"children":877},[878],{"type":862,"tag":19,"props":879,"children":880},{},[881],{"type":36,"value":802},{"data":883,"body":884},{},{"type":859,"children":885},[886],{"type":862,"tag":19,"props":887,"children":888},{},[889],{"type":36,"value":805},{"data":891,"body":892},{},{"type":859,"children":893},[894],{"type":862,"tag":19,"props":895,"children":896},{},[897],{"type":36,"value":810},{"data":899,"body":900},{},{"type":859,"children":901},[902],{"type":862,"tag":19,"props":903,"children":904},{},[905],{"type":36,"value":813},{"data":907,"body":908},{},{"type":859,"children":909},[910],{"type":862,"tag":19,"props":911,"children":912},{},[913],{"type":36,"value":816},{"data":915,"body":916},{},{"type":859,"children":917},[918],{"type":862,"tag":19,"props":919,"children":920},{},[921],{"type":36,"value":819},{"data":923,"body":924},{},{"type":859,"children":925},[926],{"type":862,"tag":19,"props":927,"children":928},{},[929,931],{"type":36,"value":930},"В файле AndroidManifest.xml в теге ",{"type":862,"tag":932,"props":933,"children":934},"application",{},[935],{"type":36,"value":936}," добавьте атрибут android:largeHeap=\"true\", чтобы увеличить лимит памяти для приложения.",[938],{"id":939,"title":940,"appliesTo":941,"author":9,"body":945,"canonical":787,"code":787,"createdAt":1694,"description":1695,"difficulty":790,"draft":791,"estimatedTime":1696,"extension":793,"faq":1697,"howToSteps":1710,"howToTotalTime":1726,"image":787,"keywords":1727,"locale":835,"meta":1738,"navigation":837,"path":842,"platform":839,"related":1739,"section":1743,"seo":1744,"severity":787,"stem":1745,"summary":1746,"tags":1747,"twitterCreator":787,"twitterSite":787,"type":1753,"updatedAt":1694,"__hash__":1754},"content_ru/guides/android/memory-profiling.md","Профилирование памяти Android: полное руководство по Android Studio",[942,943,944],"Android Studio Hedgehog (2023.1.1)+","Android 5.0 (API 21)+","Kotlin 1.8+ / Java 11+",{"type":11,"value":946,"toc":1672},[947,951,960,964,967,1003,1007,1048,1051,1089,1093,1142,1149,1153,1160,1182,1184,1188,1199,1204,1250,1261,1266,1306,1310,1321,1364,1369,1409,1420,1424,1438,1443,1467,1471,1478,1500,1507,1540,1547,1578,1585,1624,1631],[14,948,950],{"id":949},"введение-зачем-это-нужно","Введение / Зачем это нужно",[19,952,953,954,956,957,959],{},"Профилирование памяти — ключевой этап в разработке стабильных Android-приложений. Утечки памяти (memory leaks) приводят к постепенному росту потребления RAM, замедлению работы, а в худшем случае — к крашу с ошибкой ",[38,955,24],{},". Встроенный ",[22,958,145],{}," в Android Studio позволяет визуально отслеживать распределение памяти в реальном времени, делать снимки состояния кучи (Heap Dump) и находить объекты, которые не должны находиться в памяти. Этот гайд проведёт вас через весь процесс от запуска инструмента до интерпретации результатов.",[14,961,963],{"id":962},"требования-подготовка","Требования / Подготовка",[19,965,966],{},"Перед началом убедитесь, что:",[52,968,969,976,983,990,1000],{},[55,970,971,972,975],{},"У вас установлен ",[22,973,974],{},"Android Studio"," версии Hedgehog (2023.1.1) или новее. Инструмент постоянно улучшается.",[55,977,978,979,982],{},"Устройство или эмулятор работает на ",[22,980,981],{},"Android 5.0 (API 21)"," или выше.",[55,984,985,986,989],{},"Приложение собрано в ",[22,987,988],{},"debug-конфигурации"," (с включённой отладочной информацией). Для release-сборок анализ возможен, но сложнее.",[55,991,557,992,995,996,999],{},[38,993,994],{},"build.gradle"," (module) у вашего приложения включён ",[38,997,998],{},"debuggable true"," для debug-сборок (обычно это по умолчанию).",[55,1001,1002],{},"Устройство подключено по USB с включённой отладкой по USB, или запущен эмулятор.",[14,1004,1006],{"id":1005},"шаг-1-запустите-profiler-и-подключите-устройство","Шаг 1: Запустите Profiler и подключите устройство",[52,1008,1009,1015,1032,1038],{},[55,1010,1011,1012,164],{},"Запустите ваше приложение на устройстве или эмуляторе из Android Studio (кнопка ",[38,1013,1014],{},"Run",[55,1016,1017,1018,1021,1022,1024,1025,1027,1028,1031],{},"Откройте окно ",[22,1019,1020],{},"Profiler",": ",[38,1023,159],{}," или используйте сочетание клавиш ",[38,1026,163],{}," (Windows/Linux) / ",[38,1029,1030],{},"⌥⇧F10"," (macOS).",[55,1033,1034,1035,164],{},"В верхней части окна Profiler вы увидите список активных процессов. Выберите процесс вашего приложения (обычно с именем пакета, например, ",[38,1036,1037],{},"com.example.myapp",[55,1039,1040,1041,1044,1045,1047],{},"По умолчанию откроется вкладка ",[22,1042,1043],{},"CPU",". Переключитесь на вкладку ",[22,1046,170],{}," (иконка с синим графиком и цифрами).",[19,1049,1050],{},"На графике вы увидите реальное потребление памяти вашим приложением:",[242,1052,1053,1059,1065,1071,1077,1083],{},[55,1054,1055,1058],{},[22,1056,1057],{},"Java Heap",": память, управляемая JVM/ART (ваш код).",[55,1060,1061,1064],{},[22,1062,1063],{},"Native Heap",": память, выделенная через NDK (C/C++ код).",[55,1066,1067,1070],{},[22,1068,1069],{},"Graphics",": память, используемая для буферов отрисовки.",[55,1072,1073,1076],{},[22,1074,1075],{},"Stack",": память под стековые фреймы.",[55,1078,1079,1082],{},[22,1080,1081],{},"Code",": память под скомпилированный код.",[55,1084,1085,1088],{},[22,1086,1087],{},"Others",": прочее.",[14,1090,1092],{"id":1091},"шаг-2-начните-запись-и-выполните-сценарий","Шаг 2: Начните запись и выполните сценарий",[52,1094,1095,1107,1128,1133],{},[55,1096,1097,1098,1103,1104,74],{},"На панели инструментов вкладки Memory нажмите кнопку ",[22,1099,1100],{},[38,1101,1102],{},"Record memory allocations"," (иконка с красной точкой внутри кружка). Статус записи изменится на ",[38,1105,1106],{},"Recording...",[55,1108,1109,1112,1113],{},[22,1110,1111],{},"Выполните в приложении действие",", которое, как вы подозреваете, вызывает утечку. Например:\n",[242,1114,1115,1118,1125],{},[55,1116,1117],{},"Откройте и закройте фрагмент/активность несколько раз.",[55,1119,1120,1121,1124],{},"Прокрутите список (",[38,1122,1123],{},"RecyclerView",") с большим количеством элементов.",[55,1126,1127],{},"Перейдите на другой экран и вернитесь.",[55,1129,1130,1132],{},[22,1131,595],{},": пытайтесь воспроизвести сценарий, который пользователь мог бы выполнить многократно. Утечка часто проявляется после нескольких итераций.",[55,1134,1135,1136,1141],{},"После выполнения действия нажмите кнопку ",[22,1137,1138],{},[38,1139,1140],{},"Stop recording"," (та же кнопка, теперь красная). Запись выделений объектов прекратится.",[204,1143,1144],{},[19,1145,208,1146,1148],{},[22,1147,211],{},": Не записывайте слишком долго — это может привести к огромному объёму данных и замедлению работы. 30-60 секунд активных действий обычно достаточно.",[14,1150,1152],{"id":1151},"шаг-3-сделайте-heap-dump-для-анализа","Шаг 3: Сделайте Heap Dump для анализа",[19,1154,1155,1156,1159],{},"Запись allocations полезна для отслеживания частоты создания объектов, но для поиска утечек нужен ",[22,1157,1158],{},"Heap Dump"," — полный снимок объектов в куче в конкретный момент времени.",[52,1161,1162,1167,1174],{},[55,1163,1164,1165,74],{},"Убедитесь, что вы находитесь на вкладке ",[22,1166,170],{},[55,1168,173,1169,1173],{},[22,1170,1171],{},[38,1172,187],{}," (иконка с кучей мусора и стрелкой вниз). Профилер запросит у системы создание дампа.",[55,1175,1176,1177,1181],{},"Дождитесь завершения. На экране появится новая вкладка ",[22,1178,1179],{},[38,1180,1158],{}," с результатами.",[674,1183],{},[14,1185,1187],{"id":1186},"шаг-4-проанализируйте-результаты-в-analyzer","Шаг 4: Проанализируйте результаты в Analyzer",[19,1189,1190,1191,1193,1194,74],{},"Вкладка ",[22,1192,1158],{}," автоматически открывает анализатор. По умолчанию вы видите таблицу ",[22,1195,1196],{},[38,1197,1198],{},"Classes",[19,1200,1201],{},[22,1202,1203],{},"Как читать таблицу:",[242,1205,1206,1214,1222,1230],{},[55,1207,1208,1213],{},[22,1209,1210],{},[38,1211,1212],{},"Class"," — имя класса объекта.",[55,1215,1216,1221],{},[22,1217,1218],{},[38,1219,1220],{},"Instance Count"," — количество экземпляров этого класса в куче на момент дампа.",[55,1223,1224,1229],{},[22,1225,1226],{},[38,1227,1228],{},"Size"," — общий объём памяти, занятый всеми экземплярами этого класса (в КБ/МБ).",[55,1231,1232,1237,1238,1241,1242,1246,1247,1249],{},[22,1233,1234],{},[38,1235,1236],{},"Retained Size"," — ",[22,1239,1240],{},"самый важный показатель",". Это объём памяти, который будет освобождён, если ",[1243,1244,1245],"em",{},"все"," объекты этого класса (и те, на которые они ссылаются) будут удалены. Большой ",[38,1248,1236],{}," у класса, который не должен быть в памяти — верный признак утечки.",[19,1251,1252,1255,1256,1260],{},[22,1253,1254],{},"Первое действие:"," отсортируйте таблицу по столбцу ",[22,1257,1258],{},[38,1259,1236],{}," (по убыванию). Вверху окажутся классы, удерживающие наибольшие объёмы памяти.",[19,1262,1263],{},[22,1264,1265],{},"Что ищем:",[242,1267,1268,1285,1292],{},[55,1269,1270,1271,104,1274,104,1277,1280,1281,1284],{},"Классы вашего приложения (например, ",[38,1272,1273],{},"MyActivity",[38,1275,1276],{},"MyAdapter",[38,1278,1279],{},"MyViewModel","), которые ",[22,1282,1283],{},"не должны"," существовать после закрытия экрана/фрагмента.",[55,1286,1287,1288,1291],{},"Классы из библиотек, известные своими утечками (например, старые версии ",[38,1289,1290],{},"androidx.lifecycle.ViewModel"," при неправильной конфигурации).",[55,1293,1294,1295,104,1297,104,1299,104,1301,104,1303,74],{},"Большое количество экземпляров ",[38,1296,233],{},[38,1298,219],{},[38,1300,713],{},[38,1302,215],{},[38,1304,1305],{},"Fragment",[14,1307,1309],{"id":1308},"шаг-5-исследуйте-пути-до-gc-root","Шаг 5: Исследуйте пути до GC Root",[19,1311,1312,1313,1316,1317,1320],{},"Нашли подозрительный класс? Теперь нужно понять, ",[22,1314,1315],{},"почему"," он не удаляется сборщиком мусора (Garbage Collector). Для этого ищут ",[22,1318,1319],{},"GC Root"," — объект, который напрямую или через цепочку ссылок удерживает ваш объект в памяти.",[52,1322,1323,1333,1341,1357],{},[55,1324,1325,1326,1328,1329,1332],{},"В таблице ",[38,1327,1198],{}," найдите подозрительный класс и ",[22,1330,1331],{},"выделите его"," (кликните на строку).",[55,1334,1335,1336,74],{},"На панели справа (или в контекстном меню) выберите ",[22,1337,1338],{},[38,1339,1340],{},"Show Path to GC Roots",[55,1342,1343,1344,1349,1350,1353,1354,74],{},"Появится диалоговое окно с опциями. Выберите ",[22,1345,1346],{},[38,1347,1348],{},"Show all paths"," (или ",[38,1351,1352],{},"Show soft references",", если подозреваете кэши). Нажмите ",[38,1355,1356],{},"OK",[55,1358,1359,1360,1363],{},"Анализатор построит ",[22,1361,1362],{},"дерево ссылок"," от GC Root (вверху) к вашему объекту (внизу).",[19,1365,1366],{},[22,1367,1368],{},"Как интерпретировать:",[242,1370,1371,1389,1399],{},[55,1372,1373,1375,1376,104,1379,104,1382,1385,1386,164],{},[22,1374,1319],{}," — это обычно системный объект (например, ",[38,1377,1378],{},"android.app.ActivityThread",[38,1380,1381],{},"java.lang.Thread",[38,1383,1384],{},"android.view.ViewRootImpl","), или статическое поле вашего класса (",[38,1387,1388],{},"MyClass.sStaticField",[55,1390,1391,1392,1398],{},"Ищите в цепочке ",[22,1393,1394,1395,1397],{},"контекст (",[38,1396,219],{},") активности",", который, например, хранится в статическом поле или долгоживущем синглтоне. Это классическая утечка активности.",[55,1400,1401,1402,90,1405,1408],{},"Если в цепочке есть ваш ",[38,1403,1404],{},"Singleton",[38,1406,1407],{},"Object"," из кэша — значит, он не очищается при уничтожении экрана.",[204,1410,1411],{},[19,1412,592,1413,1415,1416,1419],{},[22,1414,595],{},": Не все пути до GC Root — это утечки. Если объект действительно нужен для работы приложения (например, сервис), его наличие оправдано. Ищите объекты, которые ",[1243,1417,1418],{},"должны"," были быть уничтожены (закрытые активности, фрагменты).",[14,1421,1423],{"id":1422},"проверка-результата","Проверка результата",[19,1425,1426,1427,1429,1430,1433,1434,1437],{},"После внесения исправлений в код (например, очистки ссылок в ",[38,1428,470],{},", использования ",[38,1431,1432],{},"WeakReference",", замены статических контекстов на ",[38,1435,1436],{},"ApplicationContext",") повторите шаги 1-4.",[19,1439,1440],{},[22,1441,1442],{},"Критерии успеха:",[52,1444,1445,1452,1458,1464],{},[55,1446,1447,1448,1451],{},"На графике Memory Profiler после закрытия проблемного экрана память (Java Heap) возвращается к ",[22,1449,1450],{},"базовому уровню",", а не растёт.",[55,1453,1454,1455,1457],{},"В новом Heap Dump количество экземпляров подозрительного класса (",[38,1456,1220],{},") значительно сократилось или равно нулю.",[55,1459,1460,1461,1463],{},"В анализаторе ",[38,1462,1236],{}," для этого класса стал близок к нулю.",[55,1465,1466],{},"Путь до GC Root для этого класса больше не существует или ведёт к объекту, который закономерно живёт всё время работы приложения.",[14,1468,1470],{"id":1469},"возможные-проблемы","Возможные проблемы",[136,1472,1474,1475],{"id":1473},"_1-profiler-не-показывает-процесс-приложения","1. ",[22,1476,1477],{},"Profiler не показывает процесс приложения",[242,1479,1480,1486],{},[55,1481,1482,1485],{},[22,1483,1484],{},"Причина",": Приложение собрано в release-конфигурации без debuggable флага, или устройство не авторизовано для отладки.",[55,1487,1488,1491,1492,1495,1496,1499],{},[22,1489,1490],{},"Решение",": Запустите debug-сборку. На устройстве в ",[38,1493,1494],{},"Настройки → Для разработчиков"," убедитесь, что включена ",[22,1497,1498],{},"Отладка по USB"," и вы подтвердили RSA-ключ компьютера.",[136,1501,1503,1504],{"id":1502},"_2-heap-dump-создаётся-очень-долго-или-падает-с-ошибкой","2. ",[22,1505,1506],{},"Heap Dump создаётся очень долго или падает с ошибкой",[242,1508,1509,1514],{},[55,1510,1511,1513],{},[22,1512,1484],{},": Слишком большое количество объектов в куче (десятки тысяч), нехватка памяти на компьютере для анализа.",[55,1515,1516,1518,1519],{},[22,1517,1490],{},":\n",[242,1520,1521,1524,1527,1530],{},[55,1522,1523],{},"Упростите сценарий, делайте дамп раньше.",[55,1525,1526],{},"Закройте другие тяжёлые приложения в эмуляторе/устройстве.",[55,1528,1529],{},"Увеличьте оперативную память, выделенную эмулятору (в AVD Manager).",[55,1531,1532,1533,1536,1537,164],{},"Используйте фильтры в анализаторе (поле ",[38,1534,1535],{},"Filter","), чтобы смотреть только ваши пакеты (например, ",[38,1538,1539],{},"com.example",[136,1541,1543,1544],{"id":1542},"_3-не-могу-найти-проблемный-класс-в-списке-только-системные","3. ",[22,1545,1546],{},"Не могу найти проблемный класс — в списке только системные",[242,1548,1549,1554],{},[55,1550,1551,1553],{},[22,1552,1484],{},": Утечка может быть в нативном коде (Native Heap) или в объектах, которые Profiler не может корректно отобразить (например, из-за прозрачных обёрток).",[55,1555,1556,1518,1558],{},[22,1557,1490],{},[242,1559,1560,1569,1575],{},[55,1561,1562,1563,1568],{},"Переключитесь на вкладку ",[22,1564,1565],{},[38,1566,1567],{},"Native"," в Profiler и посмотрите рост native heap.",[55,1570,395,1571,1574],{},[38,1572,1573],{},"adb shell dumpsys meminfo \u003Cpackage_name>"," в терминале для более низкоуровневого отчёта.",[55,1576,1577],{},"Если используете библиотеки с нативным кодом (например, OpenGL, FFmpeg), проверьте их документацию на предмет известных утечек.",[136,1579,1581,1582],{"id":1580},"_4-после-исправления-утечки-график-памяти-всё-равно-растёт","4. ",[22,1583,1584],{},"После исправления утечки график памяти всё равно растёт",[242,1586,1587,1594],{},[55,1588,1589,1591,1592,164],{},[22,1590,1484],{},": У вас не одна, а несколько утечек, или рост связан с закономерным кэшированием данных (например, ",[38,1593,123],{},[55,1595,1596,1518,1598],{},[22,1597,1490],{},[242,1599,1600,1607,1613],{},[55,1601,1602,1603,1606],{},"Сравните несколько Heap Dumps, сделанных с интервалом. Посмотрите, какие классы ",[1243,1604,1605],{},"увеличиваются"," в количестве между дампами.",[55,1608,1609,1610,1612],{},"Проверьте, не является ли рост линейным и предсказуемым (например, добавление элементов в ",[38,1611,93],{}," без очистки). Это может быть не утечкой, а бизнес-логикой.",[55,1614,1615,1616,1619,1620,1623],{},"Проанализируйте ",[38,1617,1618],{},"Allocation Tracker"," (кнопка ",[38,1621,1622],{},"Record allocations","), чтобы увидеть, где создаются новые объекты.",[136,1625,1627,1628],{"id":1626},"_5-путь-до-gc-root-ведёт-через-системный-класс-который-я-не-контролирую","5. ",[22,1629,1630],{},"Путь до GC Root ведёт через системный класс, который я не контролирую",[242,1632,1633,1642],{},[55,1634,1635,1637,1638,1641],{},[22,1636,1484],{},": Некоторые системные классы (например, ",[38,1639,1640],{},"InputMethodManager",") исторически содержат утечки через неочищаемые ссылки.",[55,1643,1644,1518,1646],{},[22,1645,1490],{},[242,1647,1648,1656,1669],{},[55,1649,1650,1651,90,1653,1655],{},"Проверьте, не держите ли вы сами ссылку на ",[38,1652,713],{},[38,1654,219],{}," в статическом поле или долгоживущем объекте.",[55,1657,1658,1659,1661,1662,1665,1666,74],{},"Для известных системных утечек есть проверенные паттерны: например, в ",[38,1660,470],{}," активности вызывать ",[38,1663,1664],{},"inputMethodManager.isActive = false"," или очищать фокус у ",[38,1667,1668],{},"EditText",[55,1670,1671],{},"Поищите конкретный случай (класс + \"memory leak\") в документации Android или на Stack Overflow.",{"title":40,"searchDepth":280,"depth":280,"links":1673},[1674,1675,1676,1677,1678,1679,1680,1681,1682],{"id":949,"depth":280,"text":950},{"id":962,"depth":280,"text":963},{"id":1005,"depth":280,"text":1006},{"id":1091,"depth":280,"text":1092},{"id":1151,"depth":280,"text":1152},{"id":1186,"depth":280,"text":1187},{"id":1308,"depth":280,"text":1309},{"id":1422,"depth":280,"text":1423},{"id":1469,"depth":280,"text":1470,"children":1683},[1684,1686,1688,1690,1692],{"id":1473,"depth":286,"text":1685},"1. Profiler не показывает процесс приложения",{"id":1502,"depth":286,"text":1687},"2. Heap Dump создаётся очень долго или падает с ошибкой",{"id":1542,"depth":286,"text":1689},"3. Не могу найти проблемный класс — в списке только системные",{"id":1580,"depth":286,"text":1691},"4. После исправления утечки график памяти всё равно растёт",{"id":1626,"depth":286,"text":1693},"5. Путь до GC Root ведёт через системный класс, который я не контролирую","2026-02-15 20:21:43","Узнайте, как находить и устранять утечки памяти в Android-приложениях с помощью Profiler в Android Studio. Пошаговая инструкция с примерами и скриншотами за 10 минут.","15-20 мин",[1698,1701,1704,1707],{"question":1699,"answer":1700},"Как часто нужно делать Heap Dump для поиска утечек?","Достаточно сделать снимок в момент, когда приложение уже работало какое-то время и вы подозреваете рост потребления памяти. Для хронических утечек полезно делать несколько дампов с интервалом в несколько минут и сравнивать их.",{"question":1702,"answer":1703},"Можно ли профилировать память на release-сборке?","Да, но для отладки утечек лучше использовать debug-сборку, так как в ней больше отладочной информации. Для release-сборки можно использовать `adb shell dumpsys meminfo \u003Cpackage_name>`, но это менее наглядно.",{"question":1705,"answer":1706},"Разница между Memory Profiler и Allocation Tracker?","Memory Profiler показывает общую картину использования памяти в реальном времени. Allocation Tracker (встроенный в Profiler) фиксирует каждое выделение объекта, что помогает найти конкретное место в коде, где создаётся подозрительный объект.",{"question":1708,"answer":1709},"Почему после GC память не опускается до нуля?","Это нормально. После сборки мусора в памяти остаются неизбежные объекты ядра Android, ваше приложение и его контексты. Проблема — в постоянном росте этого базового уровня (утечка), а не в его величине.",[1711,1714,1717,1720,1723],{"name":1712,"text":1713},"Запустите Profiler и подключите устройство","Откройте Android Studio, запустите приложение на устройстве или эмуляторе. Перейдите в `View → Tool Windows → Profiler` (или `Alt+Shift+F10`). В списке процессов выберите ваш запущенный апк.",{"name":1715,"text":1716},"Начните запись и выполните сценарий","В панели Profiler нажмите кнопку `Record memory allocations` (иконка с кружком и точкой). Выполните в приложении действие, которое, по вашему мнению, вызывает утечку (например, многократное открытие/закрытие экрана).",{"name":1718,"text":1719},"Сделайте Heap Dump для анализа","После выполнения действия нажмите кнопку `Dump Java heap` (иконка с кучей мусора). Profiler создаст снимок состояния кучи. Этот процесс может занять несколько секунд.",{"name":1721,"text":1722},"Проанализируйте результаты в Analyzer","После создания дампа откроется вкладка `Heap Dump`. Изучите список классов, отсортированный по количеству экземпляров (`Instance Count`) или объёму (`Size`). Ищите классы, которые не должны были оставаться в памяти.",{"name":1724,"text":1725},"Исследуйте пути до GC Root","Выберите подозрительный класс, нажмите `Show in Dominator Tree` или `Show Retained Size`. В правой панели нажмите `Show Path to GC Roots` (через контекстное меню). Это покажет цепочку ссылок, не дающих объекту быть удалённым сборщиком мусора.","PT15M",[1728,1729,1730,1731,1732,1733,1734,1735,1736,1737],"профилирование памяти android","утечка памяти android studio","android memory profiler","анализ кучи heap dump android","как найти утечку памяти в приложении","оптимизация памяти android","memory profiling android studio","dump heap android","gc root android","леак детектор android",{},[1740,1741,1742],"/guides/android/debugging-overview","/errors/android/oom","/guides/android/garbage-collection","Гайды Android",{"title":940,"description":1695},"guides/android/memory-profiling","В этом гайде вы научитесь использовать встроенный Profiler в Android Studio для анализа использования памяти, обнаружения утечек и оптимизации работы вашего Android-приложения.",[839,1748,1749,1750,1751,1752,306,351],"производительность","memory","android-studio","debug","profiling","guide","SvPl12BI_yTXv6F0N5De95WNeG6UPhaa_BueHscWZBM"]