Java-ban, amikor létrehozunk egy objektumot az osztályból, az bizonyos helyet foglal el a memóriában (kupac). Ha ezeket az objektumokat nem töröljük, akkor a memóriában marad, és felesleges, programozási szempontból nem álló helyet foglal el. A probléma megoldásához használjuk a romboló . Ebben a részben a következő alternatív lehetőségről fogunk beszélni destruktor Java nyelven . Azt is megtanuljuk, hogyan kell használni a véglegesít() módszer mint destruktor.
A romboló a konstruktor ellentéte. A konstruktor az objektumok inicializálására szolgál, míg a destruktor az objektum törlésére vagy megsemmisítésére szolgál, amely felszabadítja az objektum által elfoglalt erőforrást.
Emlékezz arra Java-ban nincs destruktor fogalma . A destruktor helyett a Java a szemétgyűjtőt biztosítja, amely ugyanúgy működik, mint a destruktor. A szemétgyűjtő egy program (szál), amely a JVM . Automatikusan törli a nem használt objektumokat (a már nem használt objektumokat), és felszabadítja a memóriát. A programozónak nem kell manuálisan kezelnie a memóriát. Lehet hibára hajlamos, sebezhető, és memóriaszivárgáshoz vezethet.
Mi az a destruktor a Java-ban?
Ez egy speciális metódus, amely automatikusan meghívódik, ha egy objektumot már nem használnak. Amikor egy objektum befejezi életciklusát, a szemétgyűjtő törli az objektumot, és felszabadítja vagy felszabadítja az objektum által elfoglalt memóriát.
Úgy is ismert, mint véglegesítők amelyek nem determinisztikusak. Ban ben Jáva által kezelt objektumok kiosztása és felosztása szemetes . A véglegesítők meghívása nem garantált, mert implicit módon hívja meg.
A Destructor előnyei
- Felszabadítja az objektum által elfoglalt erőforrásokat.
- Nincs szükség kifejezett hívásra, a program végrehajtása végén automatikusan meghívódik.
- Nem fogad el semmilyen paramétert és nem terhelhető túl.
Hogyan működik a destruktor?
Amikor az objektum létrejön, elfoglalja a halomban lévő helyet. Ezeket az objektumokat a szálak használják. Ha az objektumokat már nem használja a szál, akkor jogosulttá válik a szemétgyűjtésre. Az objektum által elfoglalt memória most már elérhető a készülő új objektumok számára. Megjegyzendő, hogy amikor a szemétgyűjtő megsemmisíti az objektumot, a JRE meghívja a finalize() metódust a kapcsolatok, például az adatbázis és a hálózati kapcsolat lezárására.
A fentiekből arra következtethetünk, hogy a destruktor és a szemétgyűjtő használata a fejlesztői beavatkozás mértéke a memóriakezelésbe. Ez a fő különbség a kettő között. A destruktor pontosan értesíti, hogy az objektum mikor fog megsemmisülni. Míg a Java-ban a szemétgyűjtő automatikusan elvégzi ugyanezt. A memóriakezelés e két megközelítésének pozitív és negatív hatásai is vannak. De a fő probléma az, hogy néha a fejlesztőnek azonnali hozzáférésre van szüksége a memóriakezeléshez.
Java finalize() metódus
A programozó nehezen tudja erőszakkal végrehajtani a szemétgyűjtőt, hogy megsemmisítse az objektumot. De a Java alternatív módot kínál ugyanerre. A Java Object osztály biztosítja a véglegesít() módszer, amely ugyanúgy működik, mint a destruktor. A finalize() metódus szintaxisa a következő:
Szintaxis:
protected void finalize throws Throwable() { //resources to be close }
Nem romboló, de extra biztonságot nyújt. Biztosítja a külső erőforrások használatát, mint például a fájl bezárása stb. a program leállítása előtt. Meghívhatjuk magának a metódusnak a használatával vagy a metódus meghívásával System.runFinalizersOnExit(true) .
- Ez a java.lang csomagban definiált Object osztály védett metódusa.
- Csak egyszer hívható.
- A finalize() metódust kifejezetten meg kell hívnunk, ha felül akarjuk írni.
- A gc() a JVM egyik metódusa, amelyet a Garbage Collector hajt végre. Meghív, ha a kupacmemória megtelt, és több memóriát igényel az újonnan érkező objektumok számára.
- A nem ellenőrzött kivételek kivételével a JVM figyelmen kívül hagyja a finalize() metódus által előforduló összes kivételt.
Példa a Destructorra
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'); } }
Kimenet:
Object is destroyed by the Garbage Collector Inside the main() method Object is destroyed by the Garbage Collector