WebView存在的内存泄漏

## 0. Notice - earlier version

* 要使用WebView不造成内存泄漏,首先应该做的就是不能在xml中定义webview节点,而是在需要的时候动态生成。即:可以在使用WebView的地方放置一个LinearLayout类似ViewGroup的节点,然后在要使用WebView的时候,动态生成即:

```java

WebView mWebView = new WebView(getApplicationgContext());

LinearLayout mll  = findViewById(R.id.xxx);

mll.addView(mWebView);

```

然后一定要在onDestroy()方法中显式的调用:

```java

protected void onDestroy() {

super.onDestroy();

mWebView.removeAllViews();

mWebView.destroy()

}

```

注意: new  WebView(getApplicationgContext()) ;必须传入ApplicationContext如果传入Activity的Context的话,对内存的引用会一直被保持着。有人用这个方法解决了当Activity被消除后依然保持引用的问题。但是你会发现,如果你需要在WebView中打开链接或者你打开的页面带有flash,获得你的WebView想弹出一个dialog,都会导致从ApplicationContext到ActivityContext的强制类型转换错误,从而导致你应用崩溃。

## 1. What leads to Memory leak

### 1.1 InnerClass

```java

public class InnerClassActivity extends Activity{

private static Leak mLeak;

class Leak {

int a = 3;

private Context mLeakContext;

Leak(Context context) {

mLeakContext = context;

}

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.test);

mLeak = new Leak(this);

Toast.makeText(this, "This is InnerClassActivity", Toast.LENGTH_SHORT).show();

}

}

```

### 1.2 Singleton

```java

public class Singleton {

private static Singleton instance;

private Context mContext1;

private Singleton(Context context) {

this.mContext1 = context;

}

public static Singleton getInstance(Context context) {

if(instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton(context);

}

}

}

return instance;

}

}

```

### 1.3 webview - earlier version

```java

public class WebViewCreateActivity extends Activity{

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.webview_create);

LinearLayout ll = (LinearLayout) findViewById(R.id.ll);

LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

WebView webView = new WebView(this);

webView.setLayoutParams(layoutParams);

WebSettings webSettings = webView.getSettings();

webSettings.setJavaScriptEnabled(true);

webSettings.setDomStorageEnabled(true);

webView.loadUrl("https://www.baidu.com/");

ll.addView(webView);

Toast.makeText(this, "Hello", Toast.LENGTH_SHORT).show();

}

}

```

## 2. How to detect the Memory Leak

### 2.1 Android Studio

* GC manually

* dump Java Heap

### 2.2 MemoryLeak in Our Project

| 品牌 | 固件 | 泄漏点 |

| ---    | ----   | -------- |

| 三星 | 4.0.4 | LightAppManager

| 小米 | 5.0.1 | LightAppManager/ mAccessibilityManager

| 华为 | 6.0   | LightAppManager/ mAccessibilityManager

#### 2.2.1 LightAppManager泄漏

3次手动GC后,内存的增长:

泄漏点1: LightAppManager 泄漏

泄漏点2: WebView-wrapper getSystemService泄漏

## 3. 官方态度

` It‘s 2016 now and, as far as I can see it, the issue still hasn‘t been resolved. I tested it on Nexus 5 and Nexus 6 with the latest WebView updates (since the component is now separate from the OS itself). Could someone, please, take a look at this issue?!  `

来源: https://code.google.com/p/android/issues/detail?id=9375

时间: 2024-10-01 22:52:32

WebView存在的内存泄漏的相关文章

Android WebView Memory Leak WebView内存泄漏

在这次开发过程中,需要用到webview展示一些界面,但是加载的页面如果有很多图片就会发现内存占用暴涨,并且在退出该界面后,即使在包含该webview的Activity的destroy()方法中,使用webview.destroy();webview=null;对内存占回收用还是没有任何效果.有人说,一旦在你的xml布局中引用了webview甚至没有使用过,都会阻碍重新进入Application之后对内存的gc.包括使用MapView有时一会引发OOM,几经周折在网上看到各种解决办法,在这里跟大

Webview内存泄漏解决办法2

在这次开发过程中,需要用到webview展示一些界面,但是加载的页面如果有很多图片就会发现内存占用暴涨,并且在退出该界面后,即使在包含该webview的Activity的destroy()方法中,使用webview.destroy();webview=null;对内存占回收用还是没有任何效果.有人说,一旦在你的xml布局中引用了webview甚至没有使用过,都会阻碍重新进入Application之后对内存的gc.包括使用MapView有时一会引发OOM,几经周折在网上看到各种解决办法,在这里跟大

安卓android WebView Memory Leak WebView内存泄漏

Android WebView Memory Leak WebView内存泄漏 在这次开发过程中,需要用到webview展示一些界面,但是加载的页面如果有很多图片就会发现内存占用暴涨,并且在退出该界面后,即使在包含该webview的Activity的destroy()方法中,使用webview.destroy();webview=null;对内存占回收用还是没有任何效果.有人说,一旦在你的xml布局中引用了webview甚至没有使用过,都会阻碍重新进入Application之后对内存的gc.包括

WebView-存在的内存泄漏

0. Notice - earlier version 要使用WebView不造成内存泄漏,首先应该做的就是不能在xml中定义webview节点,而是在需要的时候动态生成.即:可以在使用WebView的地方放置一个LinearLayout类似ViewGroup的节点,然后在要使用WebView的时候,动态生成即: WebView mWebView = new WebView(getApplicationgContext()); LinearLayout mll = findViewById(R.

android 内存泄漏检测工具 LeakCanary 泄漏金丝雀

韩梦飞沙 yue31313 韩亚飞 han_meng_fei_sha [email protected] 内存泄漏检测工具 android 内存泄漏检测工具 ======== 内存泄漏 就是  无用的对象没有被回收,占用着内存,使得可用内存变小了. 如何检测内存泄漏, 可以使用 LeakCanary来检测内存泄漏. leak  是 泄漏的意思.. Canary 是 金丝雀 的意思. 在运行 应用的时候, 泄漏金丝雀 如果检测到内存泄漏 会显示一个通知. ======== LeakCanary捕获

安卓常见引起内存泄漏的五种情况

1,单例引起的内存泄漏----解决办法 将context生命周期和application保持一致 public class SingletonAppliationContext {    private static SingletonAppliationContext instance;    private Context context;    private SingletonAppliationContext(Context context) {        this.context

WebView显示h5图片并点击放大过多后的内存泄漏问题

最近在项目开发中用webview去显示加载h5内容,而h5内容中有一些图片,并且可以点击放大看图.在比较变态的测试方法(点击图片放大,关闭当前界面,再进入,再点击图片放大,大概10次左右)后,会导致图片点击没反映了(其实就是webview内存泄漏了).错误信息如下: 12-02 10:46:19.824: E/Surface(19632): dequeueBuffer failed (Invalid argument) 12-02 10:46:19.824: E/ViewRootImpl(196

Android内存泄漏问题(一)

前言 不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露. 其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露.如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了.当然java的,内存泄漏和C/C++是不一样的.如果java程序完全结束后,它所有的对象就都不可达了,系统就可以对他们进行垃圾回收,它的内存泄露仅仅限于它本身,而不会影响整个系统的.C/C++的内存泄露就比

安卓性能测试之应用内存泄漏总结

pre { direction: ltr; color: rgb(0, 0, 10); text-align: left } pre.western { font-family: "Liberation Serif", serif; font-size: 12pt } pre.cjk { font-family: "Droid Sans Fallback"; font-size: 12pt } pre.ctl { font-family: "Droid S