The playground

More information here

úniky Paměti v Android – identifikovat, léčit a vyhnout se

Johan Olsson Sledovat Apr 13, 2016 · 9 min číst V našem každodenním snaha o budování lepší aplikace, my jako vývojáři potřebují mnoho věcí vzít v úvahu, aby se zůstat na trati, z nichž jedna je, aby se ujistil, že naše aplikace není krach. Častou příčinou havárií jsou úniky paměti. Tento konkrétní problém se může […]
Johan Olsson
Johan Olsson

Sledovat

Apr 13, 2016 · 9 min číst

V našem každodenním snaha o budování lepší aplikace, my jako vývojáři potřebují mnoho věcí vzít v úvahu, aby se zůstat na trati, z nichž jedna je, aby se ujistil, že naše aplikace není krach. Častou příčinou havárií jsou úniky paměti. Tento konkrétní problém se může projevit v různých formách. Ve většině případů vidíme stálý nárůst využití paměti, dokud aplikace nemůže přidělit více zdrojů a nevyhnutelně havaruje. V Javě to často vede k vyvolání OutOfMemoryException. V některých vzácných případech, úniku třídy mohou dokonce držet kolem dost dlouho, aby získat registrované zpětná volání, což způsobuje některé opravdu podivné chyby a příliš často hodit notoricky známý IllegalStateException.

pomozte jiným minimalizovat čas strávený na kód analýzy představím několik příkladů, úniky paměti, jak je identifikovat v Android Studio a co je nejdůležitější, jak je odstranit.

zřeknutí se odpovědnosti

účelem tohoto příspěvku a jeho příkladů kódu je podpořit hlubší pochopení správy paměti, zejména v Javě. Obecná Architektura, správa vláken a zpracování spuštěných požadavků HTTP nejsou ideální pro produkční prostředí a slouží pouze jako nosič bodu: úniky paměti v Androidu je třeba zvážit.

Registrace posluchačů

Toto neměl být problém, ale až příliš často vidím, volání do různých registračních metod, ale jejich zrušení registrace protějšky nejsou nikde vidět. Toto je potenciální zdroj úniků, protože tyto metody jsou jasně navrženy tak, aby byly navzájem vyváženy. Bez volání metody unregister bude instance pravděpodobně udržovat odkaz dlouho poté, co byl odkazovaný objekt ukončen, a tak začne unikat paměť. V Androidu je to obzvláště problematické, pokud je tento objekt aktivitou,protože často obsahuje velké množství dat. Ukážu ti, jak by to mohlo vypadat.

v tomto příkladu necháme Android LocationManager informovat nás o aktualizacích polohy. Vše, co musíme nastavit, je samotná systémová služba a zpětné volání pro příjem aktualizací. Zde implementujeme rozhraní umístění do samotné aktivity, což znamená, že LocationManager bude mít odkaz na naši aktivitu. Nyní, pokud by se zařízení mělo otáčet, byla by vytvořena nová aktivita nahrazující starou již zaregistrovanou pro aktualizace polohy. Protože služba systému bude určitě přežije všechny činnosti, LocationManager bude stále držet odkaz na předchozí činnost, což je nemožné na garbage collector uvolňují prostředky stále vázáno na konkrétní činnost, což v paměti bytí. Opakované otáčení zařízení pak způsobí, že nevratné aktivity zaplní paměť, což nakonec povede k OutOfMemoryException.

ale abychom opravili únik paměti, musíme ji nejprve najít. Naštěstí Android Studio má vestavěný nástroj s názvem Android Monitor, který můžeme použít mimo jiné k pozorování využití paměti. Jediné, co opravdu musíme udělat, je otevřít Monitor Android a přejít na kartu monitory, abyste zjistili, kolik paměti se používá a přiděluje v reálném čase.

Android Monitor v Android Studio 2.0

Jakékoli interakce, které způsobují přidělování zdrojů, projeví se zde, což je ideální místo pro sledování vaší aplikace využití zdrojů. Abychom našli únik paměti, musíme vědět, co paměť obsahuje v okamžiku, kdy máme podezření, že došlo k úniku paměti. Pro tento konkrétní příklad stačí spustit naši aplikaci, jednou otočit zařízení a poté vyvolat akci Dump Java Heap (vedle paměti třetí ikona zleva). Tím se vygeneruje soubor hprof, který obsahuje snímek paměti v době, kdy jsme vyvolali akci. Po několika sekundách Android Studio automaticky otevře soubor, což nám poskytuje elegantní vizuální reprezentaci paměti pro snadnou analýzu.

nebudu jít do hloubky o tom, jak navigovat obrovskou hromadu paměti. Místo toho nasměruji vaši pozornost na úlohy analyzátoru v pravém horním rohu obrazovky níže. Vše, co musíte udělat, aby detekovat únik paměti představil v příkladu výše je zkontrolovat Detekci Unikly Činnosti a poté stiskněte tlačítko play se dostat unikly činnosti, které vykazují podle Výsledků Analýzy.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.