安卓性能优化(3)之三大内存泄漏检测工具

三大内存泄漏检测工具:

  1. LeakCanary
  2. StrictMode
  3. Android Profiler

常见内存泄漏

  1. 单例中持有context;
  2. 非静态内部类;
  3. handler;
  4. 子线程;
  5. IO等资源未关闭。

LeakCanary使用说明

在build.gradle添加如下依赖:

dependencies {
  debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.1'
  releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'
  // Optional, if you use support library fragments:
  debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.1'
}

在Application中添加如下代码:

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    if (LeakCanary.isInAnalyzerProcess(this)) {
      // This process is dedicated to LeakCanary for heap analysis.
      // You should not init your app in this process.
      return;
    }
    LeakCanary.install(this);
    // Normal app init code...
  }
}

StrictMode使用说明

StrictMode参数:

private boolean DEV_MODE = true;
 public void onCreate() {
     if (DEV_MODE) {
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode
                 .detectDiskReads()
                 .detectDiskWrites()
                 .detectNetwork()   // or .detectAll() for all detectable problems
                 .penaltyDialog() //弹出违规提示对话框
                 .penaltyLog() //在Logcat 中打印违规异常信息
                 .penaltyFlashScreen() //API等级11
                 .build());
         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                 .detectLeakedSqlLiteObjects()
                 .detectLeakedClosableObjects() //API等级11
                 .penaltyLog()
                 .penaltyDeath()
                 .build());
     }
     super.onCreate();
 }

注意:看到有些帖子说StrictMode初始化可以放到Application里的,本人试过并不行,还是需要放到具体的Activity中.

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectActivityLeaks()
                .penaltyLog()
                .build()
        );

        new Thread() {
            @Override
            public void run() {
                while (true) {

                    SystemClock.sleep(10000);
                }
            }
        }.start();

    }
}

Android Profiler使用说明

借鉴https://blog.csdn.net/niubitianping/article/details/72617864

三者使用的优劣势

  1. StrictMode和LeakCanary操作起来比较简单,Android profiler稍麻烦;
  2. 但是Android profiler能监测内存的使用情况。

参考文章

Android工具:LeakCanary—内存泄露检测神器
Android严苛模式StrictMode使用详解

你可能感兴趣的:(android)