A Java, quan creem un objecte de la classe ocupa una mica d'espai a la memòria (heap). Si no suprimim aquests objectes, roman a la memòria i ocupa un espai innecessari que no és vertical des de l'aspecte de la programació. Per resoldre aquest problema, fem servir el destructor . En aquesta secció, parlarem de l'opció alternativa a destructor in Java . A més, també aprendrem a utilitzar finalitzar () mètode com a destructor.
El destructor és el contrari del constructor. El constructor s'utilitza per inicialitzar objectes mentre que el destructor s'utilitza per eliminar o destruir l'objecte que allibera el recurs ocupat per l'objecte.
Recorda que no hi ha cap concepte de destructor a Java . En lloc del destructor, Java proporciona el col·lector d'escombraries que funciona igual que el destructor. El col·lector d'escombraries és un programa (fil) que s'executa al fitxer JVM . Esborra automàticament els objectes no utilitzats (objectes que ja no s'utilitzen) i allibera la memòria. El programador no necessita gestionar la memòria, manualment. Pot ser propens a errors, vulnerable i pot provocar una fuga de memòria.
Què és el destructor a Java?
És un mètode especial que es crida automàticament quan un objecte ja no s'utilitza. Quan un objecte completa el seu cicle de vida, el col·lector d'escombraries elimina aquest objecte i desassigna o allibera la memòria ocupada per l'objecte.
També es coneix com finalitzadors que són no deterministes. En Java , l'assignació i desassignació d'objectes gestionats pel abocador . La invocació de finalitzadors no està garantida perquè invoca implícitament.
Avantatges de Destructor
- Allibera els recursos que ocupa l'objecte.
- No es requereix cap crida explícita, s'invoca automàticament al final de l'execució del programa.
- No accepta cap paràmetre i no es pot sobrecarregar.
Com funciona el destructor?
Quan es crea l'objecte ocupa l'espai del munt. Aquests objectes són utilitzats pels fils. Si els objectes ja no són utilitzats pel fil, esdevé apte per a la recollida d'escombraries. La memòria que ocupa aquest objecte ara està disponible per als nous objectes que s'estan creant. S'observa que quan el col·lector d'escombraries destrueix l'objecte, el JRE crida al mètode finalize() per tancar les connexions, com ara la base de dades i la connexió de xarxa.
A partir de l'anterior, podem concloure que l'ús del destructor i el col·lector d'escombraries és el nivell d'interferència del desenvolupador en la gestió de la memòria. És la principal diferència entre tots dos. El destructor notifica exactament quan es destruirà l'objecte. Mentre que a Java, el col·lector d'escombraries fa el mateix treball automàticament. Aquests dos enfocaments de la gestió de la memòria tenen efectes positius i negatius. Però el problema principal és que de vegades el desenvolupador necessita accés immediat a la gestió de la memòria.
Mètode Java finalize().
És difícil que el programador executi amb força el col·lector d'escombraries per destruir l'objecte. Però Java ofereix una manera alternativa de fer el mateix. La classe Java Object proporciona el finalitzar () mètode que funciona igual que el destructor. La sintaxi del mètode finalize() és la següent:
Sintaxi:
protected void finalize throws Throwable() { //resources to be close }
No és un destructor però proporciona seguretat addicional. Assegura l'ús de recursos externs com tancar el fitxer, etc. abans d'apagar el programa. Podem cridar-lo utilitzant el mètode en si o invocant el mètode System.runFinalizersOnExit(true) .
- És un mètode protegit de la classe Object que es defineix al paquet java.lang.
- Només es pot trucar una vegada.
- Hem de cridar explícitament el mètode finalize() si volem anul·lar el mètode.
- El gc() és un mètode de JVM executat pel Garbage Collector. Invoca quan la memòria de pila està plena i requereix més memòria per als nous objectes que arriben.
- Excepte les excepcions no marcades, la JVM ignora totes les excepcions que es produeixen pel mètode finalize().
Exemple 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'); } }
Sortida:
Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector