16 839
Tesztek Android Google Apple Microsoft Samsung Huawei Linux Okostelefon Biztonság Tudomány Facebook Videojáték Film
/ContentUploads/A142/android_memory_stats.jpg
Kattints ide  ➜

Az Android memóriakezelése

2012.09.27. 15.00
Legújabb cikkünk az Android memóriakezelésének titkaiba enged bepillantást. Érdekel az Android RAM-kezelése? Akkor ez a cikk Neked szól.


A RAM sohasem elég... vagy mégis?!

Az Android memóriakezelése egészen sajátos koncepción alapszik, aminek egy részét a Linux kernelének köszönheti. Először is, a futó appok több folyamatot (processzust) és szolgáltatást (service-t, démont, amik esetenként felfoghatók speciális folyamatokként) is magukba foglalhatnak. Fontos tudnunk, hogy sok folyamat egymás között megoszthat erőforrásokat, függvénykönyvtárakat, szóval nincs szükség ugyanazt, vagy majdnem ugyanazt többször betölteni és tárolni a memóriában (ezt a funkcionalitást a Linux kernel biztosítja). Továbbá a foglalt RAM-ot a megosztott (shared), gyorsítótárazott (cached), pufferelt (buffers) és normál folyamatok teszik ki. Számunkra most a gyorsítótárazott folyamatok érdemelnek külön figyelmet; ugyanis a legtöbb "háttérben" futó app folyamatai közéjük sorolhatók. Azért van idézőjelek között a háttérben szó, mivel nem kölcsönösen egyértelmű (nem egy-egyértelmű) megfeleltetés van a számunkra előtérben (ill. háttérben) futó appok és a rendszer számára normál és gyorsítótárazott folyamatok között. Elképzelhető, hogy aktívan használt appunk gyorsítótárazott folyamatként van a RAM-ban, míg egy számunkra háttérben lévő app normál folyamatokként van jelen a RAM-ban.

Miért is érdekes ez? Mivel a gyorsítótárazott folyamatok és kapcsolódó adataik szinte akármikor felülírhatók, pontosabban akármikor kidobhatók a RAM-ból, hogy a "helyükre" másik folyamatok adatai kerüljenek (ezt a funkcionalitást szintén a Linux kernel biztosítja). Persze nem kell attól félnünk, hogy az éppen aktuálisan, interaktívan használt előtérbeli app futása megszakad és potenciálisan elvesznek adataink: a rendszer nagyon magas prioritást ad az előtérbeli appoknak (de nemcsak azoknak!), hiszen azok megszakadása erősen (negatívan) kihatna a felhasználói élményre, ami természetesen nem (csak vészhelyzetben) tolerálható. A RAM számottevő részét a gyorsítótárazott folyamatok foglalják el, amik a rendszer gyorsítását szolgálják, de a nekik rendelkezésre bocsátott RAM-kapacitás akármikor visszavonható. Sokszor a gyorsítótárazott folyamatok által foglalt számottevő RAM kapacitás is egyszerűen használt RAM-ként van feltüntetve, ami megtévesztő lehet: a felhasználó kétségbe eshet, hogy folyamatosan 90% feletti a RAM kihasználtság, sőt, akkor is így marad, ha ezért esetleg bővíti a számítógépe RAM-ját (természetesen ezt okostelefonnal nem teheti meg, ott marad a kétségbeesés :). Sok helyen szerepel az a vélekedés, hogy Linuxon ideális esetben a teljes RAM foglalt, függetlenül attól (persze ésszerű keretek között), hogy mennyi van a számítógépünkben. Az esetek nagy többségében a gyorsítótár foglalja a ténylegesen szabad RAM nagy részét, ami teljesen normális, sőt éppenséggel kívánatos.

Ha fogytán a szabad RAM, az Android elkezdi killezni (kilőni) a legalacsonyabb prioritású appokat, nem kérleli őket, egyszerűen kiszedi őket a RAM-ból, hogy jusson hely egy relevánsabb app folyamatainak, mondjuk amit hirtelen használni szeretnénk, vagy aminek hirtelen megnőtt a memóriaigénye, ad abszurdum mindkettő körülmény egyszerre. Vannak appok, amelyek csak vészhelyzetben killelhetők, pl. a zenelejátszó Media folyamata, vagy a Launcher, esetleg az SMS kezelő app, ébresztőóra app démonjai (nyilvánavaló okokból). Nem finomkodik velük, killel ("Brute force always works."). Ez megoldást nyújt arra, hogy a (valószínűleg) szükségtelen appok minden szemetükkel együtt eltűnjenek, biztosan ne foglaljanak értékes RAM-ot. Persze a rendszer időnként killelhet olyan appokat is, amiket nem kellett volna, mert használnánk még; szerencsére ez azonban meglehetősen ritka. Mindenesetre onnan tudjuk, hogy ez történt, ha az appra való váltáskor az lassan jelenik meg, vagy extrém esetben elvesztek az appnak korábban megadott és nem mentett adataink.

Ezzel egy időben sok appot előre betölt (előtöltés, windowsos terminológiában prefetch-ként ismert), hogy javítsa a felhasználói élményt, tehát úgy tűnjön, minden egyszerre fut (true multitasking), azonban természetesen ez csak egy illúzió. Mindenesetre ha jól van implementálva, optimalizálva van az adott platformra és főleg ha hajlandó megtanulni a felhasználó szokásait, akkor nagyon sikeres, gördülékeny rendszert adhat, tényleg az lehet a felhasználó benyomása, mintha minden appja egyszerre futna, és pillanatok alatt váltogathatná azokat. Tehát a még nem használt (de nagy valószínűséggel használandó) appok előtöltése és a már nem használt (de nagy valószínűséggel már nem használandó) appok (és persze folyamataiknak a) kilövése automatizáltan, mindenfajta felhasználói beavatkozástól mentesen a háttérben dinamikusan, egyszerre megy végbe. A rendszer gyorsítása érdekében betöltött app akármikor kilőhető a memóriából, mihelyst a felhasználó egy nagyobb memóriaigényű appot indít, vagy egy létező kérne még RAM-ot. Tehát a gyorsítótárként használt memória (cache+puffer) lényegében szabad RAM.

Hangsúlyozom, ha a kritikus rendszerappok (magas prioritással) + a kernel (ami a RAM egy részét kizárólagos használatra fenntartja magának; kernelspace) nem bugosak, nem foglalják le a memóriát a szemetüknek (változóiknak, konstansaiknak, átmeneti adataiknak, részeredményeiknek) feleslegesen, akkor a fenti koncepció egy gördülékeny rendszert eredményez. Azonban a valóság mindig eltér az ideális esettől, itt sincs ez másként. Sokszor rohamtempóban fejlesztik az appokat, és nincs idő az összes memóriaszivárgás kiiktatására (sőt, a felfedezésükre sem). Ez azzal is magyarázható, hogy egyre "lustábbak" a programozók, elkényelmesedtek; de azzal is érvelhetnek, hogy képtelenség "tökéletes" appot írni, hiszen az nagyon (irreálisan) sok munkaórát igényelne. Sokszor a konkurencia miatt is sietniük kell. Azonban folyamatos optimalizációval, a bugok javításával az appok vagy éppenséggel maga a rendszer nagyon (szinte tetszőlegesen) gördülékennyé, reszponzívvá tehető.


Recent apps lista – kezünkben az irányítás?!

Az Android Ice Cream Sandwichtől felfelé megtalálható a Recent Apps lista, amit okostelefonoknál a Home gomb hosszú lenyomvatartásával, táblagépeken pedig dedikált "Apps" gombbal hívhatunk elő. Itt lehetőségünk nyílik megtekinteni a nemrég használt appokat és egyszerűen kilőhetünk/kivehetünk már nem használandó appokat a listából, az adott app vízszintes elhúzásával. Ez elméletben szép és jó, azonban természetesen felmerül a kérdés, hogy gyakorlatilag az Android mit fog ezután tenni a kérésünkkel, vajon mindig kilövi az adott appot a RAM-ból? Vagy egyáltalán, az adott app tényleg benne van a RAM-ban? Vagy minden futó app benne van a listában?

A valós helyzet egy kicsit bonyolultabb (de nem feleslegesen, hanem okkal!), mint azt elsőre gondolnánk. Ha az Android úgy gondolja, akkor kilőheti az "elhúzott" appot a recent apps menüben. Viszont ami ott van, lehet nincs is a RAM-ban és egy csomó dolog van a RAM-ban, ami ott sincs (gondoljunk például a kernelre és számos folyamatára). Sőt, lehet, hogy bár elhúzásra kerül az app, de ugyanúgy fut tovább. Szóval a recent apps menün keresztül nincs teljes irányítás a RAM-ban lévő appok felett, ez teljesen érthető. A felhasználó szándékaidat jelezheti a rendszer felé, amit az Android elbírál, és – sok szempontot mérlegelve (köztük prioritásokat, a folyamat szolgáltatásainak kritikusságát, a szabad RAM mennyiségét, a folyamat RAM-ban elfoglalt helyét) – ha rendben találja, akkor megtörténik.

Azonban elmondhatjuk, hogy legtöbbször az "elhúzott" app tényleg kikerül a memóriából. Sokszor a recent apps listában lévő appok valójában nem foglalnak értékes RAM-ot, mivel a RAM gyorsítótárazásra (a rendszer gyorsítására) használt részében vannak, és ezért bármikor automatikusan kilőheti őket a rendszer, ha szüksége van RAM-ra egy folyamatnak, netán a kapcsolódó szolgáltatásainak. Tehát jobban belegondolva, nem szükséges ezeket kilőnünk manuálisan, noha sokszor tényleg ok nélkül vannak a RAM-ban: mert ha később használnánk őket, vagy egy másik app támaszkodna a kilövendő app szolgáltatásaira, esetleg azok adataira, akkor manuális kilövés esetén újból be kell az Androidnak ezeket tölteni, ami CPU erőforrást igényel (merül az akkumulátor feleslegesen!), időbe telik (kevésbé lesz reszponzív a rendszer, romlik a felhasználói élmény) és nem utolsósorban használódik a NAND Flash technológiájú háttértár, aminek – ne feledjük – korlátos a max. olvasás-írás száma.

Meg kell jegyeznünk, hogy egyes esetekben a gyorsan, manuálisan felszabadított RAM (az app elhúzása révén) tényleg segíthet a rendszernek egy hirtelen felmerült nagyobb RAM-igény kielégítésében (főleg belépőszintű, olcsóbb eszközöknél, kevés (256 MiB) RAM esetén, és/vagy gyenge optimalizáció esetén). Sőt a hozzáértők, fejlesztők aktívan is használhatják ezt a funkciót (tudják, hogy mit csinálnak, azaz felülbírálhatják az Android döntését: pl. az Android még a RAM-ban hagyná, de a fejlesztő ki szeretné venni valamilyen, lehet, csak általa előre látott okból kifolyólag – akkor az Android biztosítja számára az eszközt ehhez, azaz – jó eséllyel – megteheti.) Azonban a legtöbb valós szituációban, átlagos felhasználót feltételezve az Android memóriamenedzsmentje átlagosan jobb döntéseket hozhat, mint a felhasználó. Ezért javasoljuk, hogy ilyen (a legtöbb) esetben nem érdemes a rendszerbe manuálisan beleavatkozni, hiszen az úgyis teszi a dolgát – az esetek többségében meglepően jól. Ekkor éppen a felesleges felhasználói közbeavatkozás révén lassulhat a rendszer vagy merülhet a szokásosnál gyorsabban az akkumulátor.


Amikor az okostelefon az okosabb. Vagy mégsem?!

A helyzet hasonló a digitális fényképezéshez: ha rendelkezésre áll a paraméterek megválasztásának szabadságát biztosító fényképezőgép, akkor az hozzáértő kezekben csodálatos felvételek készítésére ad módot, ám ugyanez a gép nem hozzáértők kezében rosszabb képeket készít, mint bármelyik, tizedannyiba kerülő kompakt gép. Persze fordítva is igaz: kompakt gép esetén, ahol nincs biztosítva a sok manuális beállítási lehetőség, akkor a kezdő a saját tudásához képest szép képeket csinál (a gép "okosabb" nála), viszont a tapasztaltabb, félprofi felhasználó kezdi érezni a kompakt gép határait, érzi, többet is ki tudna hozni a gépből, hiszen "okosabb" nála a tapasztalatának köszönhetően.

Az Android egy profi ("okos") rendszer, kiemelkedően hatékony RAM-menedzsmenttel, köszönhetően a Linux kernelének. Ugyanakkor a profi felhasználónak biztosítja is a szabadságot a beavatkozásra, a rendszer döntéseinek felülbírálatára. Ez a szabadság, "hatalom" egyben felelősséget is jelent: jó kezekben segíti a rendszert, ezáltal a felhasználói élmény is jobb lesz, azonban nem megfelelő, nem hozzáértő kezekben többet árt, mint használ. Csak akkor bíráljuk felül az Android RAM-kezelését, ha tisztában vagyunk, hogy mit teszünk, azaz – egyes esetekben legalábbis – ha nem is "okosabbak", de tapasztaltabbak vagyunk, mint a rendszer. Ebből egyenesen következik, hogy kerüljünk minden task killer appot (főleg az automatizáltakat!), főleg akkor, ha csak most ismerkedünk az Androiddal. Az ismerkedési fázisban nagy valószínűséggel a rendszerünknek nincs szüksége a mi beavatkozásainkra. Azonban ahogyan gyűlnek a tapasztalataink, kiismerjük a működését, a "lelkivilágát", egy idő után már építő módon beavatkozhatunk a rendszer működésébe. Persze, van, aki mindig is "átlagos" felhasználó marad, míg mások, kedvet éreznek a fejlődésre, tanulásra, egyre jobban megismerik az Android lelkivilágát és profi felhasználóvá, netán fejlesztővé avanzsálódnak. Az persze erősen személyiség-, egyénfüggő, ki melyik úton indul el; az érdeklődést nem lehet kikényszeríteni, azonban a motivációt lehet fokozni. A motiváció fokozására közölnék egy idézetet:

"[...] Jaj annak, aki nem ismeri rabszolgái lelkét! [...] Persze, ha valakit kielégít az, hogy tudja, hogy odabenn szorgos törpék rágcsálják a biteket, akkor neki nincs szüksége elektronikus ismeretekre." (Csákány Antal)

Természetesen "rabszolga" alatt az androidos eszközeinket kell érteni, hiszen végső soron az eszközeink szolgálnak minket (azok vannak értünk), nem pedig fordítva, sokszor akármennyire is úgy tűnik. :)

Persze, egy idő után joggal érezhetjük úgy, hogy mi vagyunk az eszközeinkért, nem pedig fordítva, ha már sokat foglalkozunk velük, megismerjük a "lelkivilágukat". Azonban reméljük, hogy "meghálálják a gondoskodást", és a jövőben a megszerzett tudásunk az előnyünkre válik és hasznot kovácsolhatunk belőle.

Végül egy androidos jó tanács: ha egy app sokszor, szükségtelenül használja a memóriát, csak egy megoldás van: el kell távolítani (nem a RAM-ból, hanem a háttértárból, a "ROM"-ból). Gyári appokat le lehet tiltani legtöbbször a Beállítások/Alkalmazások/Összes alkalmazás menüben. Erre azért van szükség, mivel az appok szinte akármikor automatikusan elindulhatnak. Ezért (is) érdemes meggondolni, hogy mely appokat telepítjük.


Tanulságok, avagy amit érdemes észben tartani

Összefoglalva a cikk tanulságait, elmondhatjuk, hogy:

A memóriahasználat miatt nem kell aggódni, mivel Android rendszeren:
1. a már memóriába betöltött adatokat több app is használhatja, sok erőforrás megosztható (ez Linuxon általános);
2. a rendszer gyorsítása érdekében előre betöltött appok akármikor automatikusan kivehetők a memóriából (ez Linuxon általános);
3. a rendszer gondoskodik róla, hogy ha egy appnak szüksége van memóriára, vagy újabb appokat indít el a felhasználó, akkor azt megadja nekik, a legkevésbé szükséges appok kilövése árán; a rendszer törekszik rá, hogy ez ne befolyásolja a felhasználói élményt – pl. gyors legyen a váltás az appok között, az éppen aktív appot nem lövi ki stb.;
4. a rendszer nem tűri, hogy nem rendszer, alacsony prioritású appok és adataik hosszabb ideig szükségtelenül foglalják az értékes memóriát;
5. a már nem használt, szükségtelen appok (folyamataik és szolgáltatásaik) kilövése teljesen automatizált; ekkor az app minden ideiglenes adata is eltűnik, nem fogja foglalni az értékes RAM-ot más, szükségesebb (valójában vagy annak vélt) appok elől.

Persze sok app szoftveres hibák (bugok) miatt nem feltétlenül szabadítja fel a neki már szükségtelen memóriaterületeket (értsd: nem ad vissza lapokat, ami már nem is kell neki – memory leak), ezzel foglalva az értékes rendszererőforrást, sok esetben lelassítva, extrém esetekben bénítva a rendszer működését. Ezért (is) kell különösen odafigyelni, hogy milyen appokat telepítünk fel.
Kattints ide  ➜

Az Androbit technológiai és tudományos magazinnál hiszünk abban, hogy az információ mindenkit megillet. Hosszú évek munkájával megszerzett hírnevünknek köszönhetően megadatott számunkra az a lehetőség, hogy műszaki témájú médiumként is elérhessünk minden internetező korosztályt. Tesszük ezt olyan hírekkel és cikkekkel, amik között egyaránt szerepel nagyobb tömegeket és kisebb szakmai csoportokat érintő tartalom is.

A témák gondos összeválogatásának és a cikkek minőségi kidolgozottságának hála mára Magyarország egyik legnépszerűbb technológiai és tudományos információforrásává váltunk – fejlesztéseinkkel és kutatásainkkal pedig igyekszünk mindig egy lépéssel a versenytársak előtt járni.

A weboldalunkon található, szerkesztőségünk által készített tartalmakra vonatkozó összes felhasználási jogot az Androbit technológiai és tudományos magazin birtokolja. A tartalmak egyes részleteinek felhasználását kizárólag látványos (vagy jól hallható) forrásmegjelöléssel engedélyezzük. A feltételek megszegésének jogi következményei lehetnek. A feltételektől eltérő tartalomfelhasználás kizárólag megegyezés útján lehetséges.
Copyright © 2007-2016 – Makay József (makay@androbit.net)
Brutális részletesség: Teljes felbontású képek a Light 16 szenzoros kamerájából
Régóta várt funkciók debütálnak az új Instagramban
Amazon Go ‑ Csak kisétálsz a boltból, fizetés nélkül
Android 1.0 Apple Pie vs. Android 7.1 Nougat
A Microsoft összeállt a Snapdragonokat gyártó Qualcommal
2016 legjobb okostelefonjai ‑ Sebességteszt
Felkapott témák
Az egyik legnépszerűbb antivírus egyben a legrosszabb is
Ezek a jelenleg kapható legerősebb okostelefonok
2016 legjobb okostelefonjai - Sebességteszt
Sokan fognak kiakadni a Samsung Galaxy S8-ra
Android 1.0 Apple Pie vs. Android 7.1 Nougat
Melyik lesz 2017 legjobb okostelefonja?
Állásajánlatok
Junior IT Helpdesk Administrator
Ügyfélszolgálati Munkatárs
Termelés támogató mérnök
Technical Design Architect Szeged
Mérnök-projektmenedzser 62682
Szimulációs mérnök - Akusztika, Járműhajtás Fejlesztés
Head Of Project Delivery Unit