为什么在HPROF文件显示泄漏活动时,LeakCanary未检测到内存泄漏

时间:2017-10-18 12:34:56

标签: android memory-leaks fusedlocationproviderapi leakcanary

我认为FusedLocationProvider api的代码泄漏了,正如我在question中提到的那样。我尝试使用LeakCanary来检测内存泄漏,但是在旋转手机后我没有收到任何内存泄漏警告,也尝试使用平板电脑。设置LeakCanary的代码:

public class MyApplication extends Application {
    private RefWatcher refWatcher;
    @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;
        }
        refWatcher = LeakCanary.install(this);
        // Normal app init code...
        Log.d("TAG", "MyApplication onCreate()");
    }
}

我尝试了20次但是2次我从LeakCanary收到通知,甚至没有旋转手机但是在设备旋转后应该发生内存泄漏。

我还有另一个问题,即使没有发生内存泄漏且没有对这些MainActivities的引用,也会创建MainActivity的新实例。

设备旋转2次而不启动位置更新:

Image No Memory Leak

启动位置更新后,设备会旋转2次: Image with Memory Leak

如果使用onPause()方法停止stopLocationUpdates()位置更新,为什么会发生内存泄漏?

为什么LeakCanary没有检测到这些泄漏?

2 个答案:

答案 0 :(得分:0)

您不需要为RefWatcher创建变量。

您可以尝试以下操作:

 @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...
}

还要确保这些东西在gradle内部。

  debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.3'
  releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'
 //Optional, if you use support library fragments:
 debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.3'
 testImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.3'

答案 1 :(得分:0)

您应该再次运行您的应用程序。因为在我们第一次启动调试版本时,金丝雀泄漏剂量能够识别泄漏。但请关闭该应用程序并再次运行,它将识别出泄漏(但请确保在弹出窗口弹出时向canaryleak授予所需的权限)。 祝你好运