Memóriaszivárgás

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2020. december 22-én felülvizsgált verziótól ; az ellenőrzések 11 szerkesztést igényelnek .

A memóriaszivárgás a számítógép szabad RAM - jának  vagy virtuális memóriájának kontrollálatlan csökkentésének folyamata, amely a futó programok hibáihoz kapcsolódik , amelyek nem szabadítják fel időben a memóriát a szükségtelen adatoktól, vagy a rendszermemória-vezérlő szolgáltatások hibáival.

Mi az a memóriaszivárgás

Tekintsük a következő C++ kódrészletet :

char * mutató = NULL ; for ( int i = 0 ; i < 10 ; i ++ ) { pointer = új karakter [ 100 ]; } törölje [] mutatót ;

Ez a példa egy objektumot hoz létre halomban a 3. sorban. A 3. sorban lévő kód 10-szer kerül végrehajtásra, és minden alkalommal, amikor az új objektum címe felülírja a mutatóban tárolt értéket. Az 5. sorban a ciklus utolsó iterációjában létrehozott objektum törlődik. Az első 9 objektum azonban a dinamikus memóriában marad, ugyanakkor nem marad a programban olyan változó, amely ezen objektumok címét tárolná. Vagyis az 5. sorban nem lehet elérni vagy törölni az első 9 objektumot.

Melyek a memóriaszivárgás veszélyei

A dinamikus memória korlátozott erőforrás. A programok dinamikus memóriáját általában egy programozási nyelvi könyvtár kezeli, amely maga is az operációs rendszer által biztosított dinamikus memórián fut.

A memóriaszivárgások oda vezetnek, hogy a program memóriafelhasználása ellenőrizhetetlenül növekszik, ennek következtében előbb-utóbb életbe lépnek a végrehajtási környezet ( operációs rendszer , virtuális gép , számítógép ) architekturális korlátai, majd a program új allokációja. a memória lehetetlenné válik. Ebben a helyzetben a memóriát kérő program általában összeomlik . Ez véletlenül megtörténhet egy teljesen más programmal, miután a program kiszivárogtatva kimeríti a számítógép teljes memóriáját.

A megelőzés módjai

A memóriaszivárgás megelőzésére többféle módszer létezik.

A dinamikus memória elutasítása

Például a FORTRAN-77 teljesen felhagy a dinamikus memóriakiosztási mechanizmusok használatával, ami kiküszöböli az ilyen hibákat, de jelentősen korlátozza a programok funkcionalitását.

Mutatók birtoklása

A mutatók birtoklása lehetővé teszi, hogy valamilyen módon megegyezzen a mutató élettartamában és annak az objektumnak az élettartamában, amelyre hivatkozik. A tulajdonosi mutatók használata azonban nem segít az objektumok közötti körkörös hivatkozások esetén. (a részletekért lásd az „ Erőforrásszerzés inicializálás ” mintát)

Szemétgyűjtés

Egyes programozási nyelvek (például Oberon , Java , .NET platformnyelvek ) eszközöket biztosítanak a fel nem használt memória automatikus felszabadítására (" szemétgyűjtő ", angol  szemétgyűjtő ). A szemétszedők megoldják a körkörös utalások problémáját is, de a szemétszállítás erőforrásigényes tevékenység. Az ilyen eszközök használatának költsége a rendszer sebessége, és ami a legfontosabb, a szemétgyűjtés váratlan szüneteket okoz a programban, ami elfogadhatatlan a valós idejű rendszerekben .

A szemétgyűjtést John McCarthy találta fel 1959 körül, miközben kifejlesztette a Lisp programozási nyelvet , amelynek szerkezete rendkívül megnehezíti a kézi memóriakezelést.

A program újraindítása

Azokban az esetekben, amikor nem lehet kiküszöbölni a memóriaszivárgást, például plug-inként szállított és külső fejlesztők által készített kód használatakor, a szivárgások figyelmen kívül hagyásának sajátos módját alkalmazzák. A kiszivárgott kód egy külön programba kerül, és ez a program a kívánt gyakorisággal újraindul. A program indítását és újraindítását egy külső program végzi, amely a kiindulási adatokat is szolgáltatja és az eredményeket is átveszi. Mivel egy program leállításakor az operációs rendszertől igényelt összes memória visszakerül az operációs rendszerbe, ez a módszer megakadályozza, hogy a szivárgások katasztrofálissá váljanak.

Egyéb források kiszivárogtatása

Van egy Handle Leak nevű hiba is : a rögzített fogantyúk nem kerülnek vissza az operációs rendszerbe.

Az ilyen hibák következményeinek leküzdése érdekében az operációs rendszer fejlesztői olyan funkcionalitást vezetnek be bennük, amely lehetővé teszi számukra a memória mennyiségének, a fogantyúk számának és az egy felhasználó vagy egy adott folyamat számára elérhető processzoridő korlátozását.

Szivárgásérzékelés

A professzionális programozási nyelvekhez léteznek speciális profilkészítő programok , amelyek lehetővé teszik többek között a memóriaszivárgások észlelését.

Egyes programozási nyelvekhez léteznek statikus kódelemzők , amelyek azonosítják azokat a programelemeket, amelyek potenciálisan logikai hibákhoz vezethetnek, beleértve a memóriaszivárgást is. Egy ilyen elemző primitív változatát szinte bármely magas szintű nyelv fordítója megvalósítja úgynevezett figyelmeztetések (figyelmeztetések) formájában - olyan üzenetek formájában, amelyek olyan konstrukciók jelenlétéről szólnak a programban, amelyek formálisan nem sértik meg a szintaxist. a nyelvet, de potenciálisan hibásak.

Vannak olyan könyvtárak a memóriahasználat hibakeresésére , amelyek segítségével a program futása közben figyelemmel kísérheti a memóriafoglalást és -felszabadítást.

Lásd még

Linkek