Я использовал инструмент leakcanary, чтобы обнаружить утечки памяти в моем приложении. Кажется, мой WebViewActivity протекает каждый раз.LeakCanary пятна Android WebView утечка памяти
Я создал простое приложение для проверки утечек. Я запускаю Activity с WebView внутри xml-файла макета/раздуваются с контекстом активности. Js выключен. Все по умолчанию ожидают, что простой webViewClient сохранит перенаправление в WebView. Он протекает каждый раз.
Я провел много исследований, единственный способ предотвратить это - запустить WebViewActivity с другим процессом и убить его внутри onDestroy. Но этот метод имеет свои недостатки.
Утечка происходит каждый раз на всех моих устройствах, работающих под управлением 5.0+, не проверяется с 4.3 и ниже.
Течь Информация наклеена ниже:
В com.example.webviewmemoryleaktest: 1,0: 1. * com.example.webviewmemoryleaktest.WebViewActivity просочились: * GC ROOT android.os.ResultReceiver $ MyResultReceiver.this $ 0 * ссылка org.chromium.content.browser.ContentViewCore $ 2 $ 1.эта $ 1 (анонимный класс расширяет android.os .ResultReceiver) * ссылка org.chromium.content.browser.ContentViewCore $ 2.эты $ 0 * ссылка org.chromium.content.browser.ContentViewCore.mContext * ссылка com.android.webview.chromium.ResourcesContextWrapperFactory $ WebViewContextWrapper.mBase * утечки экземпляру com.example.webviewmemoryleaktest.WebViewActivity
- Reference Key: 9a0346cf-6ad9-4b07-9329-A97 5d8fa3cbe
- Прибор: LGE Google Nexus 4 Оккама
- Android Версия: 5.1 API: 22
- Длительность: смотреть = 5139ms, Gc = 188ms, дамп кучи = 2822ms, анализ = 30918ms
Цените, если кто-нибудь может помочь. Благодаря!
https://github.com/square/leakcanary/issues/92#issuecomment-102181372 - у них есть документально подтвержденная процедура для устранения утечек на основе кода Android. Это также рассматривается [в документации LeakCanary] (https://github.com/square/leakcanary#my-leak-is-caused-by-and-android-sdk-implementation). – CommonsWare
Вы вызываете 'WebView.destroy()' [doc] (http://developer.android.com/reference/android/webkit/WebView.html#destroy()), когда вам больше не нужен WebView и удалили его из иерархия представлений? –
Да, я сделал mWebView.destroy()/mWebView = null/mWebView.load (около: пусто), ни один из них не работает для меня. –