android что - Застрял в «Сброс памяти, приложение замерзнет.Brrr."Сообщение




leakcanary kotlin (3)

Вы должны добавить RefWatcher в свой фрагмент так же, как то, что описано на странице проекта: https://github.com/square/leakcanary

LeakCanary.install () возвращает предварительно сконфигурированный RefWatcher. Он также устанавливает ActivityRefWatcher, который автоматически обнаруживает, что активность протекает после вызова Activity.onDestroy ().

public class ExampleApplication extends Application {

  public static RefWatcher getRefWatcher(Context context) {
    ExampleApplication application = (ExampleApplication) context.getApplicationContext();
    return application.refWatcher;
  }

  private RefWatcher refWatcher;

  @Override public void onCreate() {
    super.onCreate();
    refWatcher = LeakCanary.install(this);
  }
}

Вы можете использовать RefWatcher для отслеживания утечек фрагментов:

public abstract class BaseFragment extends Fragment {

  @Override public void onDestroy() {
    super.onDestroy();
    RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
    refWatcher.watch(this);
  }
}

Кроме того, если вы хотите получить кучу кучи при утечке памяти, просто откройте Android Device Monitor из Android Studio и выберите вкладку «Проводник». В каталоге / mnt / shell / emulated / 0 / Download / leakcanary / detected_leaks вы найдете все файлы дампа кучи.

Я пытаюсь использовать LeakCanary для обнаружения утечек памяти в моем приложении, но это не идет дальше сообщения «Сброс памяти, приложение замерзнет. Brrr». Я ждал около 20 минут или около того, но никаких изменений. Такое же поведение на этих устройствах: 1. Asus fonepad 8 (Android 5.0) 2. Sony Xperia SP (Android 5.1.1 CM 12.1 custom) 3. HTC Desire C (Android 4.4 CM 11 custom)

Я делал все, как советовал:

public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    LeakCanary.install(this);
  }
}

Если вы находитесь на Android M, вам необходимо предоставить разрешение «написать внешнее хранилище» или утечка канарейки, которая долгое время будет висеть с сообщением brrr. В своем ящике приложений долгое время нажмите на панель запуска для утечки канарейки (например, вы собираетесь ее удалить) и перетащите ее в «информацию о приложении» и включите разрешение на хранение.


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

class A {
    B bRef;
}

class B {
    A aRef;
}

public class Main {
    public static void main(String args[]) {
        A myA = new A();
        B myB = new B();
        myA.bRef = myB;
        myB.aRef = myA;
        myA=null;
        myB=null;
        /* at this point, there is no access to the myA and myB objects, */
        /* even though both objects still have active references. */
    } /* main */
}

Тогда вы можете объяснить, что при подсчете ссылок, приведенный выше код будет утечка памяти. Но большинство современных JVM больше не используют подсчет ссылок, большинство используют сборщик мусора, который фактически собирает эту память.

Затем вы можете объяснить создание объекта с базовым исходным ресурсом, например:

public class Main {
    public static void main(String args[]) {
        Socket s = new Socket(InetAddress.getByName("google.com"),80);
        s=null;
        /* at this point, because you didn't close the socket properly, */
        /* you have a leak of a native descriptor, which uses memory. */
    }
}

Тогда вы можете объяснить, что это технически утечка памяти, но на самом деле утечка вызвана собственным кодом в JVM, который выделяет основные ресурсы, которые не были освобождены вашим Java-кодом.

В конце дня, с помощью современной JVM, вам нужно написать некоторый Java-код, который выделяет собственный ресурс вне обычной области знаний JVM.





android memory-leaks leakcanary