Mik azok a memóriaszivárgások, és hogyan javíthatók ki?

Ahogy az agy kulcsfontosságú az emberi életben, a memória ugyanolyan fontos a számítógépek számára. A rendszer nem tud feladatokat ellátni, ha nem rendelkezik elegendő RAM-mal.

Memóriaszivárgás miatt RAM hiánya és más memóriaproblémák léphetnek fel. Ezért megmutatjuk, hogyan észlelheti a memóriaszivárgást és javíthatja ki azokat.

De előtte nézzünk meg többet a memóriaszivárgásról, és arról, hogy miért kell ezeket kijavítani.

Mik azok a memóriaszivárgások?

Képzeljen el egy parkolót közvetlenül egy bevásárlóközpont mellett, ahol minden autó parkolt, függetlenül attól, hogy a vásárlók befejezték-e a vásárlást, vagy sem. Az idő múlásával nem marad hely az új járművek parkolására, ami forgalmi akadályokhoz vezet, és csökkenti a bevásárlóközpont általános hatékonyságát.

Kép forrása: prateeknima.medium.com

Ugyanez a helyzet a számítógépekkel is!

A parkolóban lévő autókhoz hasonló számítógépes alkalmazások elfelejthetik felszabadítani a használt memóriát, amikor már nincs rájuk szükség. Ez megterheli a memóriát, és nem hagy teret az új feladatok zökkenőmentes futtatásához, ami egy gyakori memóriahibát, az úgynevezett memóriaszivárgást eredményez.

Példakód a memóriaszivárgás bemutatására:

void memory_allocation() {
    int *ptr = (int*)malloc(sizeof(int));
}

A fenti C kódrészlet lefoglal némi memóriát egy egész változó számára, és a memória helyét a ‘ptr’ mutatóhoz rendeli. De nincs kód a memória felszabadítására, ami memóriaszivárgáshoz vezet.

def infinite_rec():
    return infinite_rec()

A fenti Python-kódban nincs alapeset a függvény leállítására. Tehát a fenti kód verem túlcsordulást és memóriaszivárgást eredményez.

Memóriaszivárgások gyakori okai

Programozói hanyagság

A memóriaszivárgás első oka a programozó hanyagsága.

A programozók gyakran foglalnak adatokat a memóriába, de néha elfelejtik kiadni, amikor már nincs szükségük rá. Ez egy bizonyos ponton az egész memóriát lefoglalja, és nem ad helyet az elkövetkező feladatoknak, ami az úgynevezett „memóriaszivárgás” hibához vezet.

Programozói nyelvek

A beépített memóriakezelő rendszer nélküli programozási nyelvek memóriaszivárgást okozhatnak.

Az olyan programozási nyelvek, mint a Java, beépített szemétgyűjtőkkel rendelkeznek, amelyek automatikusan gondoskodnak a memóriakezelésről.

De például a C++-ban nincs beépített szemétgyűjtő. Önnek, a programozónak itt kézzel kell kezelnie a memóriát, ami memóriaszivárgáshoz vezet, ha elfelejti manuálisan megtisztítani a memóriát.

Erős gyorsítótár-használat

A gyakran használt feladatok, adatok vagy alkalmazások gyorsítótárban vannak a gyorsabb hozzáférés érdekében.

Ez memóriaszivárgási hibához vezethet, ha az elemek gyorsítótárban vannak, de nem törlődnek, bár elavultak, vagy már nem illeszkednek a jelenlegi használati szokásokhoz.

Globális változók használata

A globális változók tárolják a hozzárendelt adatokat az alkalmazás teljes élettartama alatt. Tehát a globálisabb változók használata sok memóriát használ hosszabb ideig, és memóriaszivárgást okoz.

Nem hatékony adatstruktúrák

A fejlesztők gyakran saját adatstruktúrákat hoznak létre egyéni funkciók megvalósítása érdekében. A memóriaszivárgási hibák azonban akkor jelennek meg, ha ezek az adatstruktúrák nem tudják felszabadítani a használt memóriát.

Lezáratlan kapcsolatok

Ha nem zárja be a fájlokat, adatbázisokat, hálózati kapcsolatokat stb. használat után, az is memóriaszivárgási hibákat okozhat.

Memóriaszivárgások következményei

Alacsony teljesítmény – A memóriaszivárgások felhalmozódásával fokozatosan csökken az alkalmazás vagy a rendszer teljesítménye. Ennek az az oka, hogy nem lesz szabad memória a feladatok elvégzéséhez, ami lelassítja az alkalmazást.

Összeomlott alkalmazások – A memóriaszivárgások növekedésével az alkalmazásoknak elfogy a memóriája. Egy bizonyos ponton, amikor nincs szabad memória, a program összeomlik, ami adatvesztést és alkalmazáshibákat eredményez.

Biztonsági sebezhetőségek – Az érzékeny adatok (például jelszavak, személyes adatok vagy bizalmas információk) nem megfelelő törlése a memóriából a használat után, és a memóriaszivárgás során ezeket az adatokat a támadóknak teszik ki.

Erőforrások kimerülése – Az alkalmazások több helyet foglalnak el a RAM-ból, ha memóriaszivárgás miatt elfogy a memóriájuk. Ez növeli az erőforrás-felhasználást és csökkenti a rendszer általános teljesítményét.

Hogyan lehet felismerni a memóriaszivárgást?

Kézi kódellenőrzés

Vizsgálja meg a forráskódot, hogy megtalálja azokat az eseteket, amikor a memória le van foglalva, de a használat után nem törlődik. Keressen olyan változókat és objektumokat a kódban, amelyek memóriát használnak, de nem engedik fel, amikor már nincs szükségük rá.

Ezenkívül ügyeljen az adattárolás főbb forrásaira is, azaz gondoskodjon arról, hogy az adatstruktúrák jól kezeljék a lefoglalt memóriát.

Statikus kódelemzés

Különféle jól megtervezett statikus elemző eszközök elemzik a fordító forráskódját, és észlelik a memóriaszivárgás eseteit.

Néha nyomon követik a kód általános mintáit, szabályait és hibáit, hogy kitalálják a memóriaszivárgást, még mielőtt azok bekövetkeznének.

Dinamikus elemzési eszközök

Ezek az eszközök a dinamikus megközelítést használják a kód elemzésére a végrehajtás során és a memóriaszivárgások észlelésére.

A dinamikus elemző eszközök az objektumok, funkciók futásidejű viselkedését és memóriahasználatát vizsgálják. Ez az oka annak, hogy ezek az eszközök nagyon pontosak a memóriaszivárgások észlelésében.

Profilkészítő eszközök

A profilkészítő eszközök betekintést nyújtanak abba, hogy az alkalmazás hogyan használja a memóriát.

Ön, mint fejlesztő, felhasználhatja ezeket az információkat a program memóriahasználatának elemzésére, és optimalizálhatja a memóriakezelési technikákat, hogy megelőzze az alkalmazások összeomlását és a memóriaromlási problémákat.

Memóriaszivárgás-észlelő könyvtárak

Egyes programozási nyelvek beépített vagy harmadik féltől származó könyvtárakat kínálnak a program memóriaszivárgásának észlelésére.

Például a Java-ban van egy szemétgyűjtő a memória kezelésére, a C++ pedig CrtDbg-t kínál a memóriakezeléshez.

Ezenkívül a speciális könyvtárak, mint például a LeakCanary, Valgrind, YourKit stb., memóriaszivárgásokat kezelnek különböző típusú alkalmazásokban.

Hogyan lehet javítani a memóriaszivárgást?

A memóriaszivárgások azonosítása

A memóriaszivárgások kijavításához először azonosítania kell azokat.

Manuális ellenőrzést végezhet, vagy valamilyen automatizált eszközzel észlelheti, hogy az alkalmazásból nem szivárog-e memória. Kipróbálhatja a fent említett többi memóriaszivárgás-észlelési módszert a szivárgás észlelésére.

Azonosítsa a szivárgást okozó tárgyakat

Miután a fenti lépésben megerősítette, hogy az alkalmazás memóriát szivárogtat, meg kell keresnie a szivárgást okozó objektumokat és adatstruktúrákat. Ismerje meg, hogyan foglalják le a memóriát, és hol kell felszabadítaniuk a memóriát.

Tesztesetek létrehozása

Most leszűkítette a memóriaszivárgás pontos helyét. Ezért hozzon létre egy tesztesetet, hogy megbizonyosodjon arról, hogy helyesen azonosította-e a memóriaszivárgás forrását, és ellenőrizze, hogy a szivárgás megszűnik, miután kijavította az adott objektumot.

Javítsa ki a kódot

Adja hozzá a memóriafelszabadító kódot, hogy felszabadítsa a blokkolt memóriát az azonosított hibás objektumok által. Ha a kód már létezik, frissítse a kódot, hogy megbizonyosodjon arról, hogy megfelelően felszabadítja a használt memóriát.

Teszt Újra

Ismét használjon szivárgásérzékelő eszközöket vagy automatizált teszteket annak ellenőrzésére, hogy az alkalmazás megfelelően működik-e, és nincs-e memóriablokkolás.

Tesztelje az alkalmazás teljesítményét és funkcióit is, hogy megbizonyosodjon arról, hogy a kódfrissítés nincs hatással az alkalmazás egyéb tényezőire.

Bevált módszerek a memóriaszivárgás megelőzésére

Legyen felelős programozó

Tudatosítania kell a használt memória felszabadítását vagy a memóriamutatók felszabadítását, miközben magát a kódot írja. Ez minimálisra csökkenti a memóriaszivárgás problémáit.

Emlékszel az alábbi kódra? Ahogy a cikk elején említettük, nincs memóriafelszabadító kódrészlet, így memóriaszivárgáshoz vezet.

void memory_allocation() {
    int *ptr = (int*)malloc(sizeof(int));
}

Programozóként így szabadíthatja fel a memóriát.

delete ptr;

Használjon felszerelt programozási nyelveket

Az olyan programozási nyelvek, mint a Java vagy a Python, beépített memóriakezelési könyvtárakat, például szemétgyűjtőket alkalmaznak a memóriaszivárgások automatikus kezelésére.

Bár néhány esetet figyelmen kívül hagy, ezek a beépített eszközök kezelik őket, megakadályozva az esetleges memóriaszivárgást.

Ezért azt javaslom, hogy olyan programozási nyelveket használjon, ahol a memóriakezelés be van építve.

Körlevél hivatkozások

Kerülje a körkörös hivatkozásokat a programban.

A körkörös hivatkozások egymásra utaló objektumok zárt hurkát követik. Például az a objektum b-re, a b objektum c-re, a c objektum pedig ismét a-ra utal, és nincs vége a ciklusban. Tehát a körkörös hivatkozások egy végtelen hurokhoz vezetnek, ami memóriaszivárgást okoz.

Minimalizálja a globális változók használatát

Kerülje a globális változók használatát, ha aggódik a memória hatékonysága miatt. A globális változók az alkalmazás futási ideje alatt elfoglalják a memóriát, ami rossz gyakorlat a memóriakezelésben.

Tehát váltson a helyi változókra. Ezek memóriahatékonyak, mivel felszabadítják a memóriát, miután a függvényhívás megtörtént.

A globális változók a következők szerint néznek ki, de csak szükség esetén használják őket.

int x = 5 // Global variable
void func(){
    print(x)
}

De használja a helyi változókat az alábbiak szerint:

void func(){
    int x = 5 // Local variable
    print(x)
}

A gyorsítótár memória korlátozása

Állítson be korlátot a gyorsítótár által használható memória számára. Néha a rendszerben végzett összes feladat a gyorsítótárba kerül, és ez a felhalmozott gyorsítótár memóriaszivárgáshoz vezet.

Tehát a gyorsítótár korlátozása megakadályozhatja a memóriaszivárgások előfordulását.

Teszteld jól

Vegyen fel memóriaszivárgás-teszteket a tesztelési szakaszba.

Hozzon létre automatizált teszteket, és fedje le az összes szélső esetet, hogy észlelje a memóriaszivárgásokat, mielőtt a kódot éles forgalomba bocsátaná.

Felügyeleti eszközök felszerelése

Használjon automatikus profilkészítő eszközöket a memóriahasználat nyomon követésére. A memóriahasználat rendszeres nyomon követése segít a lehetséges szivárgások azonosításában és azok időbeni kijavításában.

A Visual Studio profilozó, a NET Memory Profiler és a JProfiler néhány jó eszköz ebben az összefüggésben.

Következtetés

Hatékony memóriakezelésre van szükség az alkalmazás csúcsteljesítményének eléréséhez, és a memóriaszivárgások ebben az összefüggésben nem hagyhatók figyelmen kívül. A hatékony memóriakezelés érdekében kezelnie kell a memóriaszivárgásokat, és meg kell előznie azok jövőbeni előfordulását. Ez a cikk arról szól, hogyan teheti ezt meg.

Különféle módszereket mutattunk be a memóriaszivárgások észlelésére, bevált lépéseket azok kijavítására, valamint azokat a gyakorlatokat, amelyeket követhet a jövőbeni memóriaszivárgások elkerülése érdekében.

Ezután azt is megvizsgálhatja, hogyan lehet 5 percen belül kijavítani a „memóriahiány” hibáját a Windows rendszerben.