Áttekintés a mechanizmusok szemétgyűjtő, programozó jegyzetek

Sem meglehetősen bonyolult modern program nem szemétgyűjtés nélkül, kézi vagy automatikus. Van mit tenni - a memória továbbra is értékes erőforrás, és nem engedhetjük meg, amennyire csak lehetséges. Tehát mi a létező megközelítések szemétgyűjtő?

Manuális memória kezelése

Manuális memória kezelése egyszerű felháborító. Amikor az alkalmazás igényel, mint a memória, azt mondja malloc vagy új, és amikor a memória már nincs szükség - ingyenes vagy törölni. Az élet szép és csodálatos, a kérdés le van zárva ... vagy nem?

A gyakorlatban kiderült, hogy a feladat kezelésének felelősségét memória programozó gyakran vezet memóriavesztés hibák és lógó hivatkozásokat. Én nem beszélek ilyen apróságok, amelyek támogatják a kódot bonyolultabbá válik, mint abban az esetben az automatikus memória kezelése.

Azonban a kézi memóriakezelés még mindig széles körben használják a C, C ++ és más nyelveken. Legalábbis az az oka, hogy nem minden probléma engedheti meg magának, hogy használja a szemétgyűjtő. Példaként az ilyen problémák jöhetnek szóba, hogy dolgozzon vezetők, fordítóprogramok, kodekek / archiváló, igényes teljesítményű szerver alkalmazások és a háromdimenziós számítógépes játékok.

Manuális memória kezelése megköveteli a programozó egy bizonyos fegyelem. Ha lehetséges, kívánatos, hogy az adatokat a verem. Ha az adatokat el kell tárolni egy halom, kívánatos, hogy kiadja a allokált memória ugyanaz az eljárás és ugyanazt a módszert, ahol azt izoláltuk. Hol lehet tenni anélkül, hogy a használata kapcsolatok, az adatokat kell tárolni az érték. És így tovább.

referencia számlálók

A legegyszerűbb mechanizmus automatikus memória kezelése is, hogy a referencia száma. Az ötlet a következő. Eltekintve az adatokat a kiválasztott memória tárolja a számlálóját az adatokat. a számláló növekszik, és a pusztítás létre egy új index - csökkent. Ha ezek után csökken a készülék gróf lesz nulla, akkor további adatokat nem használható bárki által és a memória kell szabadítani.

Ez a módszer szinte nem rosszabb, mint a kézi memóriakezelés teljesítmény, de jelentősen csökkenti a hibák számát velejárói. kód támogatás is egyszerűbbé válik. Jelentős probléma ezzel a megközelítéssel abban a tényben rejlik, hogy a jelenlétében körhivatkozások, néhány számláló soha eltűnik, és a memória elfolyik. Ennek leküzdésére használja gyenge mutatókat (weakptr), amelyek nem vesznek részt a referencia számlálást.

Referencia szám meglehetősen sikeresen használják a C ++ (az úgynevezett „smart pointerek”) és a Perl-t.

Tracing szemétgyűjtő

Amennyire én tudom, ma már nem használják a tiszta formájában felkutatása szemétgyűjtő bárhol. A legtöbb nyelv automatikus memória kezelése, ezt a módszert alkalmazzák a különböző módosítások, amelyek a későbbiekben még kitérünk.

Másolás kollektor

Tárolás használt két kupac. Egyikük jelenleg használatban van, míg a második van fenntartva a jövőben. Az új adatok kerülnek az első halom.

Amikor az első kupac elfogy a szobában, elkerüljük az összes adatot, és másolja be a második halom. Ha ez az adat természetesen tömörített, és adatkapcsolatok módosítjuk. Befejezése után bypass halom fordított, a második csapat van kapcsolva, és az első - fenntartva.

Itt bőven van előnye a nyomjelző a szemétgyűjtő. Először is, nem kell tárolni minden olyan további információt az összes kiosztott memória területek (a kérdést destruktorok, finalizers ideiglenesen félre). Másrészt, mivel a tömörítés processzor cache és memória hatékonyabban használhatók.

De van még számos hátránya van. Az első dolog, hogy a fogások a szeme - 50% memóriát a legtöbb időt nem használják. De másfelől, ennek következtében a nem használt memória töredezettség is sokkal nagyobb százalékát, így talán ez csak magukat, és nem kell aggódnia. De ami igazán aggasztó, hogy sok a hosszú életű adat véglegesen másolni az egyik halom másik.

Azt is meg kell figyelni, hogy a rezsiköltségek kapcsolódó módosításának szükségességét mutató. És igen, a program idején szemétgyűjtő még felfüggeszteni.

Ha nem tévedek, a megközelítés két halom minden felhasznált vagy egyszer használatos Java.

Tracer és tömítő a szemétgyűjtő

Ennek eredményeként a hosszú élettartamú gyűjtött adatokat az elején a halom, és nem mozognak minden gyűjtemény. A memóriát használják hatékonyabban, mint abban az esetben, két kupac. Azonban az algoritmus bonyolítja a szemétgyűjtő. Annak érdekében, hogy elkerüljék a felesleges adatokat másolatok, úgy tűnik, megkövetelik beadása több optimalizáció, mint a „nem tömöríti az adatokat, ha a fragmentáció szintjét ezen a részén a halom nem haladja meg a 25% -ot”, és így tovább.

A szemétgyűjtő generációk

Az alapot a szemétgyűjtő generációk (korosztályi szemétgyűjtő) az a gondolat, hogy a legtöbb tárgy (itt ez lesz kényelmes kölcsön terminológiája OOP) már nem használják hamarosan annak megalakulását követően. Ebben a tekintetben az objektumok kombinálhatók különböző generációk.

Az új tárgyak tekinthetők tárgyak az első generáció. Ha egy ilyen objektum lépett az első (vagy általában N-edik) szemétgyűjtő, ez kerül több objektum második generációjának beolvasott ritkábban. Ha a tárgyak a készletben is tapasztalják egy szemétgyűjtő (vagy több szerelvények), az rögtön a sor tárgyak a harmadik generációs, még ritkábban ellenőrzik, és így tovább.

Általában, amikor áthalad a tárgy gráf egyszerű - ha találkoztunk az objektum egy idősebb generáció, mint a jelenleg beolvasott további ebbe az irányba haladunk. Van azonban egy kényes pillanatban. Mivel tárgyak általában eltérőek, ezek is tartalmazhatnak hivatkozásokat tárgyak fiatalabb generáció. Ezért a végrehajtása során a program figyelemmel kell kísérni a helyzetet. ha egy idősebb tárgy elkezd hivatkozni fiatalabbak és adni, ebben az esetben egy fiatal objektum a „root set” tárgyakat a megfelelő generáció. Ellenkező esetben a szemétgyűjtő tévesen törölni elérhetetlen.

A szemétgyűjtés generációk jelentősen felgyorsítja felkutatása szemétgyűjtő, és ezért széles körben elterjedt. Különösen egy ilyen megközelítést alkalmazzák a Python.

hibrid megoldások

A gyakorlatban a fenti megközelítés gyakran kombinálják és módosított, ami, például, a tömítő nyomkövetés szemétgyűjtő generációk. Egyes nyelvek, amely több szemetesek lehet választani. Például egyikük lehet gazdaságos felhasználása, a memória, a másik - a gyorsabb szemétgyűjtés. Végül is vannak párhuzamos szemetesek, de ez a kérdés túlmutat a post.

Mint a bejegyzést? Oszd meg másokkal:

Kapcsolódó cikkek