Jak naprawić wycieki pamięci w aplikacji na Androida

Jeśli Twoja aplikacja działa wolno na niektórych urządzeniach lub funkcje Instant Run w Android Studio przestają działać losowo, to możesz doświadczać wycieków pamięci.

Kiedy zdarza się wyciek pamięci?

Jedną z wielkich rzeczy w Javie jest garbage collector (GC). Garbage collector działa okresowo, aby sprawdzić obiekty, które nie są w użyciu i usuwa je. Wyciek pamięci będzie miał miejsce, gdy istnieją obiekty, które nie są używane przez aplikację, ale garbage collector nie może ich rozpoznać. Stąd, pozostaną one w pamięci nieużywane, zmniejszając ilość pamięci dostępnej dla aplikacji, co powoduje nieoczekiwane rezultaty.

How To Detect Memory Leaks?

Istnieje kilka sposobów, aby to zrobić. Niektóre z nich omówimy w tym artykule.

Na początek jednak napiszmy trochę kodu, który może spowodować wyciek pamięci. Stworzymy aplikację z dwoma aktywnościami. Aktywność A będzie miała przycisk, który otwiera aktywność B. Wraz z tym, stworzymy również klasę singleton, która przechowuje statyczne odniesienie do Context.

class Manager {
private static Manager ourInstance;

private Context;

static Manager getInstance(Context context) {
if (ourInstance == null) {
ourInstance = new Manager(context);
}
return ourInstance;
}

private Manager(Context context) {
this.context = context;
}
}

Będziemy wywoływać ten singleton z aktywności A

Manager.getInstance(this);

Detecting Memory Leaks Using Android Studio’s Monitors

android memory leaks

Android Studio dostarcza przydatnych narzędzi do profilowania wydajności aplikacji, a jednym z nich jest Monitor Pamięci. Możemy użyć Monitora Pamięci do wykrycia wycieków pamięci poprzez następujące kroki:

1. Uruchom swoją aplikację na urządzeniu mobilnym lub emulatorze.

2. Otwórz Monitor Androida (Naciśnij Cmd + 6 w Mac lub Alt + 6 w Windows). W górnej części Monitora Pamięci, kliknij na Start Allocation Tracking.

3. Użyj aplikacji wokół części, którą podejrzewasz, że może doświadczać wycieku pamięci. W naszym przykładzie przejdziemy do innej aktywności.

4. Kliknij na Initiate GC, aby zmusić garbage collector do rozpoczęcia zbierania obiektów, które nie są obecnie używane i usunięcia ich. Powinieneś zobaczyć, że wykres pamięci nieco się zmniejszył.

5. Kliknij na Dump Java Heap, aby Android Studio wygenerowało plik .hprof, który zawiera zrzut sterty. Najprostszym sposobem na sprawdzenie wycieku pamięci jest użycie Analyzer Tasks

6. Otwórz zakładkę Analyzer Tasks, a następnie kliknij na Run w górnej części tej zakładki. Powinieneś zobaczyć wyciekłe działania w zakładce Wyniki analizy poniżej zakładki Zadania analizatora.

wycieki pamięci android

Detecting Memory Leaks Using Leak Canary

Leak Canary to biblioteka stworzona przez Square i jest to bardzo szybki sposób na wykrywanie wycieków pamięci. Leak Canary pozwala na wykrywanie wycieków pamięci w dłuższych seriach, ponieważ nie trzeba podłączać urządzenia do Android Studio i monitorować aplikacji przez długi okres czasu. Leak Canary wyśle Ci powiadomienia, gdy tylko wystąpi wyciek pamięci.

Integracja Leak Canary jest naprawdę prosta. Wszystko, co musisz zrobić, to dodać następujące elementy do swojego pliku build.gradle na poziomie aplikacji:

dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.1′
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1′
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.1′
}

Następnie dodaj następujący kod do swojej klasy Application:

@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Ten proces jest przeznaczony dla LeakCanary do analizy sterty.
// Nie powinieneś inicjować swojej aplikacji w tym procesie.
return;
}
LeakCanary.install(this);
// Normalny kod inicjujący aplikację…
}

I to by było na tyle, możesz zaczynać.

Wykrywanie możliwych wycieków za pomocą Infer

Infer to narzędzie do analizy statycznej stworzone przez Facebooka, które pomaga znaleźć możliwe wyjątki wskaźnika zerowego i wycieki zasobów, a także zasięg adnotacji, brakujące osłony zamków i warunki wyścigu współbieżności. Jest to dobre narzędzie, które można dodać do swojego CI, aby pokonać wszystkie możliwe błędy. Jest to również open source, więc rozwój tego narzędzia jest wciąż rozwijany. Więcej informacji na temat Infera można znaleźć w dokumentacji Quick Start.

Dodaj komentarz