解决几个常见内存泄露

1、解决了webview的内存泄露

 ViewParent parent = contetentWebView.getParent();
            if (parent != null) {
                ((ViewGroup) parent).removeView(webView);
            }
            webView.stopLoading();
            // 退出时调用此方法,移除绑定的服务,否则某些特定系统会报错
            webView.removeJavascriptInterface("xxx");
            webView.getSettings().setJavaScriptEnabled(false);
            webView.destroyDrawingCache();
            webView.clearHistory();
            webView.removeAllViews();
            try {
                contetentWebView.destroy();
            } catch (Throwable ex) {

            }

2、解决了ConnectivityManager的内存泄露,类似的泄露还有WifiManager

public static boolean isNetworkAvailable(Context ctx) {
      try {
          //user activity to get ConnectivityManager will cause memory leak,so here use ApplicationContext instead
          if (ctx instanceof Activity) {
              ctx = ctx.getApplicationContext();
          }
          ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
          NetworkInfo info = cm.getActiveNetworkInfo();
          return (info != null && info.isAvailable());
      } catch (Exception e) {
          e.printStackTrace();
          return false;
      }
  }

3、内存静态类单例 导致的内存泄露,暂未解决

/**
 * JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的。
 * 这样当我们第一次调用getInstance的时候,JVM能够帮我们保证instance只被创建一次,并且会保证把赋值给instance的内存初始化完毕。
 * 测试发现,single被装载到jvm后,无法被GC回收,此处会造成内存泄露,因为游戏在运行的任何时候都可能调当前类的实例,
 * 目前还没想到好的办法释放这个内存
 */

 public static A getInstance() {
      return AAPIHolder.single;
  }

  private static class AAPIHolder{
      private static final A single = new A ();
  }  

你可能感兴趣的:(解决几个常见内存泄露)