Почему утечка памяти не обнаруживается с помощью LeakCanary, в то время как в файле HPROF отображаются действия с утечками

Я думаю, что код API FusedLocationProvider протекает, как я задал в этом вопросе. Я пытался использовать для обнаружения утечки памяти с помощью 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, даже не поворачивая телефон, но утечка памяти, которая должна произойти после поворота устройства.

У меня также есть еще один вопрос, почему создаются новые экземпляры MainActivity, даже если не происходит утечки памяти и нет ссылок на эти MainActivities.

Устройство поворачивается 2 раза без запуска обновлений местоположения:

Изображение без утечки памяти

Устройство поворачивается 2 раза после запуска обновления местоположения: Изображение с утечкой памяти

Почему происходят утечки памяти, если обновления местоположения остановлены onPause() методом stopLocationUpdates()?

Почему LeakCanary не обнаруживает эти утечки?


person Thracian    schedule 18.10.2017    source источник


Ответы (2)


Вам не нужно создавать переменную для 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...
}

Также убедитесь, что они есть внутри вашего градиента.

  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'
person AndroidLearner    schedule 05.04.2019

вам следует снова запустить приложение. потому что в первый раз, когда мы запускаем отладочную версию, canaryleak не распознает утечку. но закройте приложение и запустите его снова, оно распознает утечку (но обязательно дайте необходимое разрешение для canaryleak, когда появится всплывающее окно). удачи

person Mosayeb Masoumi    schedule 25.11.2019