Elpusztítani elavult ssypki (objektumok)

Ha megváltoztatja egy kézi memória programozási nyelv, mint a C vagy C ++ valamely nyelvre automatikus memória tisztítása (szemétgyűjtéssel - „kollekció!<а мусора") ваша работа как программиста существенно упрощается благодаря тому обстоятельству, что ваши объекты автоматически утилизируются, как только вы перестаете их использовать. Когда вы впервые сталкиваетесь с этой особенностью, то воспринимаете ее как волшебство. Легко может создаться впечатление, что вам больше не нужно думать об управлении’ памятью, но это не совсем так.

Tekintsük a következő egyszerű stack végrehajtását:

// Tud észre a „memóriavesztés”?

public class Stack

privát Object [] elemek;

privát int size = 0;

nyilvános Stack (int initialCapacity)

this.elements = új Object [initialCapacity];

public void push (Object e)

public Object pop ()

dobja új EmptyStackException ();

Object eredmény = elemek [-size];

elemek [size] = null; // Távolítsuk elavult hivatkozás

* Bizonyosodjunk meg róla, hogy van helye a verem még tovább

* Egyetlen elemet. minden alkalommal,

* Növelni kell a tömb, kapacitásának megkétszerezése.

private void ensureCapacity ()

ha (elements.length == méret)

Object [] oldElements = elemek;

elemek = új Object [2 * elements.length + 1];

public static void main (String [] args)

Stack s = új Stack (0);

A (int i = 0; i

A (int i = 0; i

Ebben a programban nincsenek hibák, amelyek vonzzák a tekintetet. Akkor alaposan tesztelni, akkor át minden teszt sikeres, de még mindig van egy probléma van rejtve. Ebben a programban, van egy „memóriavesztés”, amely csendben megnyilvánulhat a kiesett termelékenység miatt fokozott teljesítményt a szemétgyűjtő, vagy a forma méretének növelése a használt memória. Szélsőséges esetben az ilyen memóriavesztés okozhat lapozás a lemezre, és még egy összeomlás OutOfMemoryError diagnózis, bár az ilyen hibák viszonylag ritkák.

public Object pop ()

dobja új EmptyStackException (); Object eredmény = elemek [-size];

elemek [size] = null; // eltávolítani egy elavult linkre

Visszaállítása az elavult utalások ad egy előnye: ha majd valaki véletlenül próbálja dereference e linkek, akkor a program végén azonnal a diagnózis NullRoiptegEhsertiop inkább csendben végre a rossz működését. Mindig hasznos felismerni fIrogrammirovaniya hibákat a lehető leggyorsabban.

Amikor a programozók első találkozás egy hasonló probléma, elkezdenek viszontbiztosíthatók által nullázás minden utalást tárgyakat, de ha egyszer a program befejeződött velük. Ez nem szükséges, mert a program rendetlenséget és csökkenti annak

Tehát, ha kell visszaállítani link? Melyik szolgáltatás a Stack osztály tette fogékony memóriavesztés? Stack osztály kezeli a memóriát. tárhely áll egy sor elemek (és annak sejtek hivatkozásokat tárgyak, nem magát a objektumot). Mint fentebb említettük, az elemek az aktív részben a tömb, mint alkalmazott a többi - szabad. A szemétgyűjtő tudják ezt nem tudja, és neki minden utalást tárgyakat, amelyek tömb tárolja egyenlő „fokozat érvényes. Csak a programozó tudja, hogy az inaktív része a tömb nincs szükség. Jelentése ennek a szemétgyűjtő programozó csak manuálisan visszaállíthatja a tömb elemek mozognak a nem-aktív része a tömb.

Általánosságban elmondható, hogy ha egy osztály kezd kezelni a memóriát, a programozónak kell gondolni memóriavesztés. Amint az elem a tömb megjelent, objektumokra mutató hivatkozásokat fennállt ez az elem be kell állítani.

Egy másik gyakori forrása a memóriavesztést cache. Forgalomba egy a cache a linket egy tárgyat, akkor könnyű elfelejteni, hogy ott van, és hogy tartsa a kapcsolatot a cache egy hosszú idő után ő lett érvénytelen. Két lehetséges megoldás erre a problémára. Ha történetesen létre cache amelyben felvétel jelentős pontosan addig, amíg a külső cache a linkek adjuk meg, elképzelhető, hogy ezt a gyorsítótárat WeakHashMap: ha a rekordok elavultak, akkor automatikusan törlődnek. Általában az idő, amely alatt a bejegyzés jelentős. nem egyértelműen meghatározott. Bejegyzés elveszítik jelentőségüket idővel. Ilyen körülmények között a cache kell időnként tisztítani rekordok hogy senki nem használja. Az ilyen tisztító végezhet háttér szál (például API-n keresztül java.util. Titeg) vagy lehet egy mellékhatása az új bejegyzések hozzáadása, hogy a cache. Amikor a második megközelítést alkalmazzák az osztályban módszer removeEldestEntry java.util.LinkedHashMap, benne 1.4-es verziója.

Mivel a memóriavesztés általában nem manifesztálódik formájában nyilvánvalóan nem, akkor marad a rendszerben évek óta. Jellemzően csak kimutatni alapos ellenőrzést a kód, vagy egy hibakereső eszköz használatával, ismert alakítója (kupac profiler). Ezért nagyon fontos, hogy megtanulják a problémák megelőzésére, mint ez előtt állnak elő, és hogy elejét vegye.

Forrás: Dzhoshua Bloh, Java TM programozás hatékonyságát, Publisher "Lori"