Jak opravit úniky paměti v aplikaci pro Android

Pokud je vaše aplikace na některých zařízeních pomalá nebo pokud náhodně přestávají fungovat funkce okamžitého spuštění v Android Studiu, může se jednat o úniky paměti.

Kdy dochází k únikům paměti?

Jednou ze skvělých vlastností Javy je garbage collector (GC). Garbage collector se pravidelně spouští, aby zkontroloval objekty, které se nepoužívají, a odstranil je. K úniku paměti dojde, když existují objekty, které aplikace nepoužívá, ale garbage collector je nedokáže rozpoznat. Proto zůstanou v paměti nevyužité, čímž se sníží množství paměti dostupné pro aplikaci, což způsobí neočekávané výsledky.

Jak zjistit únik paměti?

Je několik způsobů, jak to udělat. Některými z nich se budeme zabývat v tomto článku.

Nejprve si však napíšeme kód, který by mohl způsobit únik paměti. Vytvoříme aplikaci se dvěma aktivitami. Aktivita A bude mít tlačítko, které otevře aktivitu B. Vedle toho vytvoříme také singletonovou třídu, která bude obsahovat statickou referenci na Kontext.

třída Manager {
private static Manager ourInstance;

private Context context;

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

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

Tento singleton budeme volat z aktivity A

Manager.getInstance(this);

Detekce úniků paměti pomocí monitorů Android Studia

android memory leaks

Android Studio poskytuje šikovné nástroje pro profilování výkonu vaší aplikace a jedním z nich je Memory Monitor. Monitor paměti můžeme použít k odhalení úniků paměti pomocí následujících kroků:

1. Pomocí Monitoru paměti zjistíme úniky paměti. Spusťte aplikaci na mobilním zařízení nebo v emulátoru.

2. Otevřete aplikaci Android Monitor (stiskněte klávesy Cmd + 6 v počítači Mac nebo Alt + 6 v systému Windows). V horní části okna Sledování paměti klikněte na možnost Spustit sledování alokací.

3. Použijte aplikaci v okolí části, u které máte podezření na únik paměti. V našem příkladu přejdeme na jinou činnost.

4. Klepnutím na Iniciovat GC přinutíte garbage collector, aby začal sbírat objekty, které se právě nepoužívají, a odstranil je. Měli byste vidět, jak se graf paměti o něco zmenší.

5. V případě, že jste se rozhodli, že sběrač paměti bude sbírat paměť. Klikněte na Dump Java Heap, aby Android Studio vygenerovalo soubor .hprof, který obsahuje snímek haldy. Nejjednodušší způsob, jak zkontrolovat únik paměti, je použít úlohu Analyzer Tasks

6. Otevřete kartu Analyzer Tasks a poté klikněte na Spustit v horní části této karty. Uniklé aktivity byste měli vidět na kartě Výsledky analýzy pod kartou Úlohy analyzátoru.

úniky paměti android

Detekce úniků paměti pomocí knihovny Leak Canary

Leak Canary je knihovna vytvořená společností Square a je to velmi rychlý způsob detekce úniků paměti. Leak Canary umožňuje detekovat úniky paměti při delším běhu, protože nemusíte připojovat zařízení k Android Studiu a sledovat aplikaci po dlouhou dobu. Leak Canary vám zašle oznámení, kdykoli dojde k úniku paměti.

Integrace Leak Canary je opravdu snadná. Stačí do souboru build.gradle na úrovni vaší aplikace přidat následující:

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‘
}

Poté přidejte do třídy Application následující kód:

@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// Tento proces je vyhrazen LeakCanary pro analýzu haldy.
// V tomto procesu byste neměli initovat svou aplikaci.
return;
}
LeakCanary.install(this);
// Normální init kód aplikace…
}

A to je vše, můžete začít.

Detekce možných úniků pomocí nástroje Infer

Infer je nástroj statického analyzátoru vytvořený společností Facebook, který vám pomůže najít možné výjimky nulových ukazatelů a úniky prostředků, stejně jako dosažitelnost anotací, chybějící stráže zámků a podmínky souběhu. Je to dobrý nástroj, který můžete přidat do CI, abyste překonali všechny možné chyby. Je to také open source, takže vývoj nástroje se stále vyvíjí. Více informací o nástroji Infer najdete v jeho dokumentaci pro rychlý start.

Napsat komentář