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"