Zkontrolujte využití paměti své aplikace' pomocí nástroje Profilování paměti

Profilování paměti je součást nástroje Profilování Androidu, která vám pomůže identifikovat úniky paměti a odčerpávání paměti, které mohou vést k zasekávání, zamrzání a dokonce k pádu aplikace. Zobrazuje graf využití paměti vaší aplikace v reálném čase a umožňuje zachytit výpis haldy, vynutit garbage collections a sledovat alokace paměti.

Pro otevření nástroje Profilátor paměti postupujte podle následujících kroků:

  1. Klikněte na Zobrazit > Nástroj Windows > Profilátor (můžete také kliknout na Profil na panelu nástrojů).
  2. Zvolte zařízení a proces aplikace, který chcete profilovat, na panelu nástrojů Profilátoru Android. Pokud jste připojili zařízení přes USB, ale nevidíte ho v seznamu, ujistěte se, že máte zapnuté ladění USB.
  3. Kliknutím kamkoli na časovou osu PAMĚŤ otevřete profilovač paměti.

Paměť aplikace můžete také zkontrolovat z příkazového řádku pomocí nástrojedumpsys a také zobrazit události GC v logcatu.

Proč byste měli profilovat paměť aplikace

Android poskytuje prostředí se spravovanou pamětí – když zjistí, že aplikace již nepoužívá některé objekty, garbage collector uvolní nepoužívanou paměť zpět na haldu. Způsob, jakým Android zjišťuje nevyužitou paměť, se neustále vylepšuje, ale v určitém okamžiku musí systém na všech verzích Androidu váš kód na chvíli pozastavit. Většinou jsou tyto pauzy nepostřehnutelné. Pokud však vaše aplikace alokuje paměť rychleji, než ji systém dokáže shromáždit, může se vaše aplikace zdržet, zatímco sběrač uvolní dostatek paměti, aby uspokojil vaše alokace. Toto zpoždění by mohlo způsobit, že vaše aplikace bude přeskakovat snímky a způsobí viditelné zpomalení.

I když vaše aplikace nevykazuje zpomalení, pokud uniká paměť, může si tuto paměť ponechat, i když je na pozadí. Toto chování může zpomalit výkon zbytku paměti systému tím, že si vynucuje zbytečné události garbage collectionevents. Nakonec je systém nucen proces vaší aplikace ukončit, aby získal zpět paměť. Když se pak uživatel vrátí k vaší aplikaci, musí ji zcela restartovat.

Chcete-li těmto problémům předejít, měli byste pomocí nástroje Memory Profiler provádět následující činnosti:

  • Pátrejte po nežádoucích vzorcích přidělování paměti v časové ose, které by mohly způsobovat problémy s výkonem.
  • Vypisujte haldu Javy, abyste zjistili, které objekty v daném okamžiku spotřebovávají paměť. Několik výpisů haldy za delší časové období může pomoci identifikovat úniky paměti.
  • Zaznamenávejte alokace paměti během běžné i extrémní interakce uživatele, abyste přesně určili, kde váš kód alokuje příliš mnoho objektů v krátkém čase nebo alokuje objekty, které se stávají úniky.

Informace o programovacích postupech, které mohou snížit využití paměti vaší aplikace, najdete v článku Správa paměti vaší aplikace.

Přehled nástroje Memory Profiler

Při prvním otevření nástroje Memory Profiler se zobrazí podrobná časová osa využití paměti vašíaplikace a přístup k nástrojům pro vynucení garbage collection, zachycení výpisu haldy a záznam alokací paměti.

Obrázek 1. Profilovač paměti

Jak je uvedeno na obrázku 1, výchozí zobrazení profilovače paměti zahrnuje následující:

  1. Tlačítko pro vynucení události garbage collection.
  2. Tlačítko pro zachycení výpisu haldy.

    Poznámka: Tlačítko pro záznam alokací paměti se zobrazuje napravo od tlačítka výpisu haldy pouze při připojení k zařízení se systémem Android 7.1 (úroveň API 25) nebo nižším.

  3. Rozbalovací nabídka pro určení, jak často má profilovač zachycovat alokace paměti. Výběr vhodné možnosti vám může pomoci zlepšit výkon aplikace při profilování.
  4. Tlačítka pro zvětšení/zmenšení časové osy.
  5. Tlačítko pro přechod na živá data o paměti.
  6. Časová osa událostí, která zobrazuje stavy činnosti, události uživatelského vstupu a události otáčení obrazovky.
  7. Časová osa využití paměti, která obsahuje:
    • Skládaný graf, který ukazuje, kolik paměti je využíváno jednotlivými kategoriemi paměti, jak je uvedeno na ose y vlevo a barevným klíčem v horní části.
    • Přerušovaná čára udává počet alokovaných objektů, jak je uvedeno na ose y vpravo.
    • Ikona pro každou událost garbage collection.

Pokud však používáte zařízení se systémem Android 7.1 nebo nižším, nejsou ve výchozím nastavení viditelné všechny údaje z profilování. Pokud se zobrazí zpráva „Advancedprofiling is unavailable for the selected process“, musíte zapnout pokročilé profilování, abyste viděli následující:

  • Časová osa událostí
  • Počet alokovaných objektů
  • Události odklízení odpadu

V systému Android 8.1.1 se zobrazují následující údaje.0 a vyšší je pokročilé profilování u laditelných aplikací vždy povoleno.

Jak se počítá paměť

Čísla, která vidíte v horní části profileru paměti (obrázek 2), vycházejí ze všech soukromých paměťových stránek, které aplikace podle systémuAndroid obsadila. Tento počet nezahrnuje stránky sdílené se systémem nebo jinými aplikacemi.

Obrázek 2. Legenda k počtu paměti v horní částiprofileru paměti

Kategorie v počtu paměti jsou následující:

  • Java: Paměť z objektů alokovaných z kódu Java nebo Kotlin.
  • Nativní:

    I když ve své aplikaci nepoužíváte C++, můžete zde vidět nějakou použitou nativní paměť, protože rámec Androidu používá nativní paměť ke zpracování různých úloh za vás, například při zpracování obrazových prostředků a jiné grafiky – i když kód, který jste napsali, je v jazyce Java nebo Kotlin.

  • Grafika: Paměť používaná pro fronty grafické vyrovnávací paměti pro zobrazení pixelů na obrazovce, včetně GL povrchů, GL textur atd. (Všimněte si, že se jedná o paměť sdílenou s CPU, nikoli o vyhrazenou paměť GPU.)

  • Zásobník: Paměť používaná nativními zásobníky i zásobníky Java ve vaší aplikaci. Obvykle souvisí s tím, kolik vláken aplikace běží.

  • Kód:

  • Ostatní:

  • Allocated: Paměť používaná vaší aplikací, kterou systém neumí zařadit: Počet objektů Java/Kotlin alokovaných vaší aplikací. Nepočítají se objekty alokované v jazycích C nebo C++.

    Při připojení k zařízení se systémem Android 7.1 a nižším se tento počet alokací spustí až v okamžiku, kdy se profilovač paměti připojí k vaší spuštěné aplikaci. Takže všechny objekty alokované před zahájením profilování se nezapočítávají. Systém Android 8.0 a vyšší však obsahuje nástroj pro profilování v zařízení, který sleduje všechny alokace, takže toto číslo vždy představuje celkový počet nevyužitých objektů Java ve vaší aplikaci v systému Android 8.0 a vyšším.

Při porovnání s počty paměti z předchozího nástroje Android Monitor zaznamenává nový nástrojMemory Profiler paměť jinak, takže se může zdát, že využití paměti je nyní vyšší. Profilovač paměti sleduje některé další kategorie, které zvyšují celkový součet, ale pokud vás zajímá pouze paměť na haldě Java, mělo by být číslo „Java“ podobné hodnotě z předchozího nástroje. ačkoli číslo Java pravděpodobně neodpovídá přesně tomu, co jste viděli v nástroji AndroidMonitor, nové číslo zohledňuje všechny fyzické paměťové stránky, které byly alokovány do haldy Java vaší aplikace od doby, kdy byla rozvětvena ze Zygote. Poskytuje tedy přesnou reprezentaci toho, kolik fyzické paměti vaše aplikace skutečně využívá.

Zobrazit alokace paměti

Alokace paměti ukazují, jak byly alokovány jednotlivé objekty Java a odkazy JNI ve vašípaměti. Konkrétně vám Memory Profiler může ukázat následující informace o alokacích objektů:

  • Jaké typy objektů byly alokovány a kolik místa zabírají.
  • Sledování zásobníku každé alokace, včetně toho, ve kterém vlákně.
  • Kdy byly objekty dealokovány (pouze při použití zařízení se systémem Android 8.0nebo vyšším).

Pokud vaše zařízení používá systém Android 8.0 nebo vyšší, můžete si alokace objektů kdykoli zobrazit následujícím způsobem: Přetažením na časové ose vyberte oblast, pro kterou chcete zobrazit alokace (jak je znázorněno na videu 1). Není třeba zahajovat relaci nahrávání, protože systém Android 8.0 a vyšší obsahuje nástroj pro profilování bez zařízení, který neustále sleduje alokace vaší aplikace.

Video 1. Se systémem Android 8.0 a vyšším vyberte existující oblast časové osy pro zobrazení alokací objektů

Pokud vaše zařízení používá systém Android 7.1 nebo nižší, klikněte na tlačítko Record memoryallocations na panelu nástrojů Memory Profiler. Během nahrávání sleduje nástrojMemory Profiler všechny alokace, ke kterým ve vaší aplikaci dochází. Až skončíte, klikněte na tlačítko Zastavit nahrávání (stejné tlačítko; viz video 2) a zobrazte alokace.

Video 2. Se systémem Android 7.1 a nižšími verzemi musítevýslovně zaznamenávat alokace paměti

Po výběru oblasti časové osy (nebo po ukončení nahrávání se zařízením se systémem Android 7.1 nebo nižší), zobrazí se pod časovou osou seznam alokovanýchobjektů, seskupených podle názvu třídy a seřazených podle počtu haldy.

Chcete-li zkontrolovat záznam alokace, postupujte podle následujících kroků:

  1. Prohlédněte si seznam a najděte objekty, které mají neobvykle velký počet haldy a které by mohly být uniklé. Chcete-li si usnadnit vyhledávání známých tříd, klikněte na záhlaví sloupce Název třídy a seřaďte je podle abecedy. Poté klikněte na název třídy. Vpravo se zobrazí podokno Zobrazení instancí se zobrazením jednotlivých instancí dané třídy, jak je znázorněno na obrázku 3.
    • Případně můžete objekty rychle vyhledat kliknutím na tlačítko Filtr,nebo stisknutím kláves Control+F (Command+F na Macu) a zadáním názvu třídy nebo balíku do vyhledávacího pole. Můžete také vyhledávat podle názvu metody, pokud v rozbalovací nabídce vyberete položkuRozsah podle zásobníku volání. Pokud chcete použít regulárnívýrazy, zaškrtněte políčko vedle položky Regex. Pokud je váš vyhledávací dotaz citlivý na velikost písmen, zaškrtněte políčko vedle položkyMatch case.
  2. V podokně Instance View klikněte na instanci. Níže se zobrazí karta Zásobník volání, která ukazuje, kde byla daná instance alokována a ve kterém vlákně.
  3. Na kartě Zásobník volání klikněte pravým tlačítkem myši na libovolný řádek a výběrem možnostiSkočit na zdrojový kód otevřete daný kód v editoru.

Obrázek 3. Na kartě Zásobník volání klikněte pravým tlačítkem myši na libovolný řádek a vyberte možnostSkočit na zdrojový kód. Podrobnosti o každém alokovaném objektuse objeví v zobrazení instance vpravo

Dvě nabídky nad seznamem alokovaných objektů slouží k výběru, kterou haldu chcete prověřit a jak data uspořádat.

V nabídce vlevo vyberte, kterou haldu chcete prověřit:

  • výchozí halda: Když systém nezadá žádnou haldu.
  • image heap: Třídy, které se načítají během spouštění systému. Je zaručeno, že alokace zde se nikdy nepřesunou nebo nezmizí.
  • zygote heap:
  • hromada aplikací: Hromada kopírování při zápisu, odkud je proces aplikace rozvětven v systému Android.
  • hromada aplikací:
  • JNI heap: Primární halda, na které vaše aplikace alokuje paměť:

V nabídce vpravo vyberte způsob uspořádání alokací:

  • Uspořádat podle třídy: Seskupí všechny alokace podle názvu třídy. Toto je výchozí nastavení.
  • Uspořádat podle balíčků:
  • Uspořádat podle zásobníku volání:

Zlepšení výkonu aplikace při profilování

Pro zlepšení výkonu aplikace při profilování profilovač paměti ve výchozím nastavení pravidelně vzorkuje alokace paměti. Při testování na zařízeních s úrovní API 26 nebo vyšší můžete toto chování změnit pomocí rozbalovacího seznamu Sledování alokací. K dispozici jsou tyto možnosti:

  • Úplné: Zachycuje všechny alokace objektů v paměti. Toto je výchozí chování ve verzi Android Studio 3.2 a starší. Pokud máte aplikaci, kteráalokuje hodně objektů, můžete při profilování pozorovat viditelné zpomalení vašíaplikace.
  • Sampled: Vzorkuje alokace objektů v paměti v pravidelných intervalech. Toto je výchozí možnost a má menší vliv na výkon aplikace při profilování. Aplikace, které alokují velké množství objektů v krátkém časovém úseku, mohou přesto vykazovat viditelné zpomalení.
  • Vypnuto: Zastaví sledování alokace paměti vaší aplikace.

Zobrazení globálních referencí JNI

Java Native Interface (JNI) je rámec, který umožňuje kódu Javy a nativnímu kódu volat jeden druhého.

Reference JNI jsou spravovány ručně nativním kódem, takže je možné, že objekty Javy používané nativním kódem budou udržovány při životě příliš dlouho. Některé objekty na haldě Javy se mohou stát nedosažitelnými, pokud je odkaz JNI zahozen, aniž by byl nejprve explicitně smazán. Také je možné vyčerpat limit globálních odkazů JNI.

Pro řešení těchto problémů použijte zobrazení haldy JNI v nástroji Memory Profiler pro prohlížení všech globálních odkazů JNI a jejich filtrování podle typů Javy a nativních zásobníků volání. Díky těmto informacím můžete zjistit, kdy a kde jsou globální odkazy JNI vytvářeny a odstraňovány.

Při spuštěné aplikaci vyberte část časové osy, kterou chcete zkontrolovat, a z rozbalovací nabídky nad seznamem tříd vyberte položku JNI heap.Poté můžete kontrolovat objekty v haldě jako obvykle a poklepáním na objekty na kartě Zásobník alokačních volání zjistit, kde jsou ve vašem kódu alokovány a uvolňovány reference JNI, jak je znázorněno na obrázku 4.

Obrázek 4. Zobrazení globálních referencí JNI

Chcete-li zkontrolovat alokace paměti pro kód JNI vaší aplikace, musíte aplikaci nasaditna zařízení se systémem Android 8.0 nebo vyšším.

Další informace o JNI najdete v části Tipy JNI.

Profiler nativní paměti

Profiler paměti aplikace Android Studio obsahuje profiler nativní paměti proaplikace nasazené na fyzických zařízeních se systémem Android 10; podpora pro zařízení se systémem Android 11 je v současné době k dispozici v předběžné verzi aplikace Android Studio 4.2.

Profiler nativní paměti sleduje alokace/dealokace objektů v nativnímkódu za určité časové období a poskytuje následující informace:

  • Alokace:
  • Deallocations: Počet objektů alokovaných prostřednictvím malloc() nebo newoperátoru během zvoleného časového období:
  • Allocations Size: A count of objects deallocated via free() ordelete operator during selected time period:
  • Deallocations Size: Souhrnná velikost všech alokací ve zvoleném časovém období v bajtech:
  • Celkový počet: Hodnota ve sloupci Allocations minus hodnota ve sloupci Deallocations.
  • Zbývající velikost:

Pro zahájení záznamu klikněte na tlačítko Record native allocations v horní části oknaMemory Profiler:

Když jste připraveni dokončit záznam, klikněte na tlačítko Stop recording.

Ve výchozím nastavení používá Native Memory Profiler velikost vzorku 32 bajtů: Pokaždé, když je alokováno 32 bajtů paměti, je pořízen snímek paměti. Menší velikost vzorku vede k častějšímu pořizování snímků, což přináší přesnější údaje o využití paměti. Větší velikost vzorku poskytuje méně přesnáúdaje, ale spotřebuje méně prostředků v systému a zlepší výkon při záznamu.

Chcete-li změnit velikost vzorku nástroje Native Memory Profiler:

  1. Zvolte Spustit > Upravit konfigurace.
  2. V levém panelu vyberte modul aplikace.
  3. Klikněte na kartu Profilování a do pole označeného Interval vzorkování nativní paměti (bajty) zadejte velikost vzorku.
  4. Sestavte a znovu spusťte aplikaci.

Pořiďte výpis haldy

Výpis haldy ukazuje, které objekty ve vaší aplikaci využívají paměť v době pořízení výpisu haldy. Zejména po delší uživatelské relaci může výpis haldy pomoci identifikovat úniky paměti tím, že ukáže objekty, které jsou stále v paměti a o kterých se domníváte, že by tam již neměly být.

Po zachycení výpisu haldy můžete zobrazit následující:

  • Jaké typy objektů má vaše aplikace alokovány a kolik jich je.
  • Kolik paměti každý objekt využívá.
  • Kde jsou ve vašem kódu uloženy odkazy na jednotlivé objekty.
  • Zásobník volání, kde byl objekt alokován. (Zásobníky volání jsou v současné době k dispozici s výpisem haldy pouze v systému Android 7.1 a nižším, pokud výpis haldy zachytíte při záznamu alokací.)

Chcete-li zachytit výpis haldy, klikněte na tlačítko Dump Java heap na panelu nástrojů nástroje Memory Profiler. během výpisu haldy se může dočasně zvýšit množství paměti Java.To je normální, protože výpis haldy probíhá ve stejném procesu jako vaše aplikacea vyžaduje určitou paměť pro shromáždění dat.

Výpis haldy se zobrazí pod časovou osou paměti a ukazuje všechny typy tříd v haldě, jak je znázorněno na obrázku 5.

Obrázek 5: Výpis haldy. Zobrazení výpisu haldy

Pokud potřebujete přesněji určit okamžik vytvoření výpisu, můžete vytvořit výpis haldy v kritickém bodě kódu aplikace volánímdumpHprofData().

V seznamu tříd můžete vidět následující informace:

  • Alokace:
  • Nativní velikost: Celková velikost nativní paměti využívané tímto typem objektu(v bytech). Tento sloupec je viditelný pouze pro Android 7.0 a vyšší.

    U některých objektů alokovaných v Javě zde uvidíte paměť, protože Androidpoužívá nativní paměť pro některé třídy frameworku, napříkladBitmap.

  • Plná velikost:

  • Zachovaná velikost:

Pomocí dvou nabídek nad seznamem alokovaných objektů můžete zvolit, které výpisy z haldy chcete kontrolovat a jak data uspořádat.

Z nabídky vlevo vyberte, kterou haldu chcete kontrolovat:

  • výchozí halda: Když systém nezadá žádnou haldu.
  • aplikační halda:
  • image heap: Primární halda, na které vaše aplikace alokuje paměť: Systémová spouštěcí bitová kopie, která obsahuje třídy, jež jsoupřednačítány během spouštění systému. Je zaručeno, že se alokace zde nikdy nepřesunou nebo nezmizí.
  • zygote heap:

V nabídce vpravo vyberte, jak chcete alokace uspořádat:

  • Uspořádat podle tříd: Seskupí všechny alokace podle názvu třídy. Toto je výchozí nastavení.
  • Uspořádat podle balíčků:
  • Uspořádat podle zásobníku volání: Seskupí všechny alokace do odpovídajícího zásobníku volání. Tato volba funguje pouze v případě, že při záznamualokací zachytíte výpis haldy. I tak je pravděpodobné, že v haldě budou objekty, které byly alokovány před zahájením záznamu, takže tyto alokace se zobrazí jako první, jednoduše seřazené podle názvu třídy.

Seznam je ve výchozím nastavení seřazen podle sloupce Zadržená velikost. Chcete-li seřadit podle hodnot v jiném sloupci, klikněte na záhlaví sloupce.

Kliknutím na název třídy otevřete okno Instance View vpravo(na obrázku 6). Každá uvedená instance obsahuje následující údaje:

  • Hloubka:
  • Nativní velikost: Tento sloupec je viditelný pouze pro Android 7.0 a vyšší.
  • Mělká velikost:
  • Zadržená velikost: Velikost této instance v paměti Java:

Obrázek 6. Doba potřebná k zachycení výpisu haldy je uvedena na časové ose

Pro kontrolu haldy postupujte podle následujících kroků:

  1. Prohlédněte si seznam a najděte objekty, které mají neobvykle velké množství haldy a které by mohly unikat. Chcete-li si usnadnit vyhledávání známých tříd, klikněte na záhlaví sloupce Název třídy a seřaďte je podle abecedy. Poté klikněte na název třídy. Vpravo se zobrazí podokno Zobrazení instancí se zobrazením jednotlivých instancí dané třídy, jak je znázorněno na obrázku 6.
    • Případně můžete objekty rychle vyhledat kliknutím na tlačítko Filtr,nebo stisknutím kláves Control+F (Command+F na Macu) a zadáním názvu třídy nebo balíku do vyhledávacího pole. Můžete také vyhledávat podle názvu metody, pokud v rozbalovací nabídce vyberete položkuRozsah podle zásobníku volání. Pokud chcete použít regulárnívýrazy, zaškrtněte políčko vedle položky Regex. Pokud je váš vyhledávací dotaz citlivý na velikost písmen, zaškrtněte políčko vedle položkyMatch case.
  2. V podokně Instance View klikněte na instanci. Níže se zobrazí referenční tabulka, která zobrazuje všechny odkazy na tento objekt.

    Nebo klikněte na šipku vedle názvu instance pro zobrazení všech jejích polí a poté klikněte na název polepro zobrazení všech jeho odkazů. Pokud chcete zobrazit podrobnosti o instanci pole, klikněte na pole pravým tlačítkem myši a vyberte možnost Přejít na instanci.

  3. Na kartě Reference, pokud identifikujete odkaz, který by mohl ubírat paměť, klikněte na něj pravým tlačítkem myši a vyberte možnost Přejít na instanci. Tím se vybere odpovídající instance z výpisu haldy a zobrazí se její vlastní údaje o instanci.

V výpisu haldy hledejte úniky paměti způsobené některou z následujících položek:

  • Dlouhodobé odkazy na Activity, Context,View, Drawable a další objekty, které mohou obsahovat odkaz na kontejner Activity nebo Context.
  • Nestatické vnitřní třídy, například Runnable, které mohou držet instanci Activity.
  • Paměti, které drží objekty déle, než je nutné.

Uložení výpisu haldy jako souboru HPROF

Po pořízení výpisu haldy jsou data zobrazitelná v nástroji Memory Profiler pouze v době, kdy je profilovač spuštěn. Když relaci profilování ukončíte, výpis haldy se ztratí. Pokud jej tedy chcete uložit pro pozdější kontrolu, exportujte výpis haldydo souboru HPROF. V Android Studiu 3.1 a nižších verzích je tlačítko Exportovat zachycení do souboru na levé straně panelu nástrojů pod časovou osou; vAndroid Studiu 3.2 a vyšších verzích je tlačítko Exportovat výpis haldy vpravo od každé položky výpisu haldy v podokně Relace. V zobrazeném dialogovém okně Export Asdialog uložte soubor s příponou .hprof.

Chcete-li použít jiný analyzátor HPROF, jako jeejhat,musíte soubor HPROF převést z formátu Android do formátu Java SE HPROF.můžete tak učinit pomocí nástroje hprof-conv, který je k dispozici v adresářiandroid_sdk/platform-tools/. Spusťte příkaz hprof-conv se dvěma argumenty: původním souborem HPROF a místem pro zápis převedeného souboru HPROF. Například:

hprof-conv heap-original.hprof heap-converted.hprof

Importovat soubor výpisu haldy

Chcete-li importovat soubor HPROF (.hprof), klikněte na tlačítko Spustit novou relaci profilování v podokněRelace, vyberte možnost Načíst ze souboru a vyberte soubor z prohlížeče souborů.

Soubor HPROF můžete také importovat přetažením z prohlížeče souborů do okna editoru.

Detekce úniků v nástroji Memory Profiler

Při analýze výpisu haldy v nástroji Memory Profiler můžete filtrovat profilová data, o kterých si Android Studio myslí, že by mohla indikovat úniky paměti pro Activity aFragment instance ve vaší aplikaci.

Typy dat, které filtr zobrazuje, zahrnují následující:

  • Activity instance, které byly zničeny, ale jsou stále odkazovány.
  • Fragment instance, které nemají platný FragmentManager, ale jsou stále odkazovány.

V určitých situacích, jako jsou následující, může filtr poskytnout falešně pozitivní výsledky:

  • Je vytvořena Fragment, ale ještě nebyla použita.
  • Je cachována Fragment, ale ne jako součást FragmentTransaction.

Chcete-li použít tuto funkci, nejprve zachyťte výpis haldy, ale importujte soubor výpisu haldy do aplikace Android Studio. Chcete-li zobrazit fragmenty a aktivity, u kterých možná dochází k úniku paměti, zaškrtněte políčko Activity/Fragment Leaks v panelu heapdump nástroje Memory Profiler, jak je znázorněno na obrázku 7.

Obr. 7. Filtrování výpisu haldy na úniky paměti.

Techniky profilování paměti

Při používání nástroje Memory Profiler byste měli kód aplikace zatěžovat a zkoušet hledat úniky paměti. Jedním ze způsobů, jak vyvolat úniky paměti ve vaší aplikaci, je nechat ji chvíli běžet před kontrolou haldy. Úniky mohou pronikat až na vrchol alokací v haldě. Čím menší je však únik, tím déle musíte aplikaci spouštět, abyste ho viděli.

Únik paměti můžete také vyvolat jedním z následujících způsobů:

  • Přepněte zařízení z polohy na výšku do polohy na šířku a zpět několikrát, když je v různých stavech aktivity. Otáčení zařízení může často způsobit, že aplikaci unikne objektActivity,Context neboView, protože systém vytvoří objekt Activity, a pokud vašeaplikace drží odkaz na některý z těchto objektů někde jinde, systém jej nemůže vynést do koše.
  • Přepínejte mezi svou aplikací a jinou aplikací, když se nacházíte v různých stavech aktivity (přejděte na obrazovkuHome a pak se vraťte do své aplikace).

Tip: Výše uvedené kroky můžete provést také pomocí testovacího rámcemonkeyrunner.

.

Napsat komentář

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