在我的应用中有两项活动,即A和B.
活动A:
它有一个列表,可以简要显示有关项目的信息。单击A上的项目时,它会加载活动B.
活动B:
它有两个网页浏览量和几个列表视图。活动顶部由标题Web视图占用。活动的下半部分有标签主机,它在第一个标签中托管第二个网页视图,其余每个标签都包含一个列表视图。
问题:
当用户从A导航到B时,堆大小会显着增加。即使在我从B导航回A之后,堆大小仍然是相同的。甚至没有字节减少,实际上它有时会增加。是的,因为这些网页浏览量。我已阅读有关SO和其他网站上的Web视图内存泄漏的信息。我按照提到here
的方法无论什么堆大小都没有回到导航到B之前的状态。
真的很感激,如果有人可以指导我进行可能的修复
注意:
我已经阅读过此内容并在SO上关注此问题。 Memory leak in WebView
编辑:
我在B中尝试过没有Web视图,并且堆大小的增加非常小于0.5 MB,但Web浏览量增加了4-5 MB
堆大小日志(通过以下建议提到here )
onCreate B
debug.heap native: allocated 4.11MB of 4.17MB (0.01MB free) in []
debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free)
onDestroy B
debug.heap native: allocated 8.66MB of 10.08MB (0.48MB free) in []
debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free)
on Resume A
debug.heap native: allocated 7.94MB of 10.08MB (1.32MB free) in []
debug.memory: allocated: 12.00MB of 96.00MB (0.00MB free)
我通过在B启动之前和之后进行堆转储来交叉检查数字,并且崩溃,堆大小非常接近我在日志中获得的堆
答案 0 :(得分:14)
我遵循了一系列步骤,减少了内存占用。这就是我做的, 而不是通过xml静态创建webview我现在以编程方式创建webview并将其添加到容器中。一旦不再需要webview,我将从容器中删除webview,然后从webview中删除所有视图并在其上调用destroy。最终分配的内存减少了。
private void releaseWebView() {
webViewContainerRelView.removeAllViews();
if(mWebView != null){
mWebView.setTag(null);
mWebView.clearHistory();
mWebView.removeAllViews();
mWebView.clearView();
mWebView.destroy();
mWebView = null;
}
}
我从Activity的onDetachedFromWindow方法调用releaseWebView(),如下所示。
@Override
public void onDetachedFromWindow() {
super.onDetachedFromWindow();
releaseWebViews();
}