Colectorul de reziduuri

Dacă un obiect nu mai este necesar, el poate fi distrus, adică eliminat din memorie. În mașina virtuală Java, există un colector de reziduuri de memorie  (engleză: garbage collector) care eliberează automat spațiul de memorie ocupat de obiectele către care nu mai există nici o referință. în consecință, programatorul nu mai este pus în situația să prevadă explicit în program distrugerea obiectelor și, deci clasele nu mai conțin destructori, ca în alte limbaje de POO.

În programul din fișierul Referinte.java se dă un exemplu de situație în care unele obiecte rămân fără referințe. Dacă, după ce s-a ajuns în situația din Figura 2, se execută instrucțiunile:
    e=b;
    a="Sir nou";
    c=new String(a);
se ajunge în situația din Figura 3.

- Figura 3 -

S-au făcut, față de situația din Figura 2, următoarele transformări:
    - referinței e i s-a atribuit aceeași valoare ca referinței b;
    - s-a construit un obiect cu conținutul "Șir nou", iar variabila aa primit ca valoare referința la acest obiect;
    - s-a construit un obiect cu același continut ca cel indicat de a, iar variabila c indică acum acest nou obiect.
În consecință, două din obiectele "un șir" construite initial au rămas fără referințe. Nu mai există nici o cale în program de a folosi aceste obiecte, deci ele trebuie să fie eliminate. Acest rol este îndeplinit de colectorul de reziduuri. Programatorul nu are însă posibilitatea de a decide în ce moment se va produce eliminarea efectivă a acestor obiecte, decizia aparținand numai colectorului de reziduuri.
 

Metoda finalize

În clasa Object exista metoda

    protected void finalize() throws Throwable

Aceasta metodă este invocată de colectorul de reziduuri, atunci când acesta determină că nu mai există referințe către obiectul respectiv. În clasa Object, această metodă nu efectuează nimic.

Metoda finalize  poate fi redefinită în orice altă clasă, pentru a elibera resurse sau a efectua orice alte acțiuni necesare înainte de distrugerea obiectului respectiv. De exemplu, dacă obiectul respectiv a deschis anumite fișiere sau conexiuni externe, în metoda finalize se poate efectua închiderea lor.

Metoda finalize nu este  apelată explicit în programul de aplicație. Apelarea metodei finalize se face numai de către colectorul de reziduuri (garbage collector), dar nu imdeiat ce un obiect a rămas fără referință, ci abia atinci când acest obiect a "intrat în atenția" colectorului. Este posibil ca executarea aplicației să se incheie înainte ca "finalizarea" unor obiecte să aibă loc.

Exemplu
În aplicația din fișierul Finalizari.java este declarată clasa ProbaFinaliz, în care este redefinită metoda finalize() din clasa Object. În clasa Finalizari din același fisier se construiesc două obiecte din clasa ProbaFinaliz, după care se elimină referințele către aceste obiecte. Având în vedere că imediat după aceea se încheie executarea aplicației, cel mai probabil este că nu va avea loc invocarea de către colectorul de reziduuri a metodei finalize().
 



© Copyright 2000 - Severin BUMBARU, Universitatea "Dunărea de Jos" din Galați