În Java, când creăm un obiect al clasei, acesta ocupă ceva spațiu în memorie (heap). Dacă nu ștergem aceste obiecte, el rămâne în memorie și ocupă spațiu inutil care nu este vertical din punct de vedere al programării. Pentru a rezolva această problemă, folosim distrugător . În această secțiune, vom discuta opțiunea alternativă la destructor în Java . De asemenea, vom învăța și cum să folosim finaliza () metoda ca destructor.
The distrugător este opusul constructorului. Constructorul este folosit pentru a inițializa obiecte, în timp ce destructorul este folosit pentru a șterge sau distruge obiectul care eliberează resursa ocupată de obiect.
Sa nu uiti asta nu există un concept de destructor în Java . În locul destructorului, Java furnizează colectorul de gunoi care funcționează la fel ca și destructorul. Colectorul de gunoi este un program (thread) care rulează pe JVM . Acesta șterge automat obiectele nefolosite (obiectele care nu mai sunt folosite) și eliberează memoria. Programatorul nu are nevoie să gestioneze memoria, manual. Poate fi predispus la erori, vulnerabil și poate duce la o scurgere de memorie.
Ce este destructorul în Java?
Este o metodă specială care este apelată automat atunci când un obiect nu mai este folosit. Când un obiect își încheie ciclul de viață, colectorul de gunoi șterge acel obiect și dealoca sau eliberează memoria ocupată de obiect.
Este cunoscut și ca finalizatoare care sunt nedeterministe. În Java , alocarea și dealocarea obiectelor gestionate de colector de gunoi . Invocarea finalizatoarelor nu este garantată deoarece invocă implicit.
Avantajele Destructorului
- Eliberează resursele ocupate de obiect.
- Nu este necesar niciun apel explicit, acesta este invocat automat la sfârșitul execuției programului.
- Nu acceptă niciun parametru și nu poate fi supraîncărcat.
Cum funcționează destructorul?
Când obiectul este creat, acesta ocupă spațiul din heap. Aceste obiecte sunt folosite de fire. Dacă obiectele nu mai sunt folosite de thread, acesta devine eligibil pentru colectarea gunoiului. Memoria ocupată de acel obiect este acum disponibilă pentru obiectele noi care sunt create. Se observă că atunci când colectorul de gunoi distruge obiectul, JRE apelează metoda finalize() pentru a închide conexiunile, cum ar fi baza de date și conexiunea la rețea.
Din cele de mai sus, putem concluziona că utilizarea destructorului și a colectorului de gunoi este nivelul de interferență al dezvoltatorului în gestionarea memoriei. Este principala diferență între cele două. Destructorul anunță exact când va fi distrus obiectul. În timp ce se află în Java, colectorul de gunoi face același lucru automat. Aceste două abordări ale managementului memoriei au efecte pozitive și negative. Dar principala problemă este că uneori dezvoltatorul are nevoie de acces imediat la gestionarea memoriei.
Metoda Java finalize().
Este dificil pentru programator să execute cu forță colectorul de gunoi pentru a distruge obiectul. Dar Java oferă o modalitate alternativă de a face același lucru. Clasa Java Object oferă finaliza () metodă care funcționează la fel ca și destructorul. Sintaxa metodei finalize() este următoarea:
Sintaxă:
protected void finalize throws Throwable() { //resources to be close }
Nu este un destructor, dar oferă un plus de securitate. Acesta asigură utilizarea resurselor externe, cum ar fi închiderea fișierului, etc. înainte de a închide programul. Îl putem apela folosind metoda însăși sau invocând metoda System.runFinalizersOnExit(true) .
- Este o metodă protejată a clasei Object care este definită în pachetul java.lang.
- Poate fi apelat o singură dată.
- Trebuie să apelăm explicit metoda finalize() dacă dorim să o înlocuim.
- gc() este o metodă de JVM executată de Garbage Collector. Se invocă atunci când memoria heap este plină și necesită mai multă memorie pentru noile obiecte care sosesc.
- Cu excepția excepțiilor neverificate, JVM ignoră toate excepțiile care apar prin metoda finalize().
Exemplu de Destructor
DestructorExample.java
public class DestructorExample { public static void main(String[] args) { DestructorExample de = new DestructorExample (); de.finalize(); de = null; System.gc(); System.out.println('Inside the main() method'); } protected void finalize() { System.out.println('Object is destroyed by the Garbage Collector'); } }
Ieșire:
Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector