Vraag hoe een object in Java te vernietigen?


Ik ben deze vraag tegengekomen in een interview met de volgende opties:

Hoe een object in Java te vernietigen?

a. System.gc();  
b. Runtime.getRuntime.gc();  
c. object.delete();  
d. object.finalize();  
e. Java performs gc by itself, no need to do it manually.
  1. Het antwoord zou e moeten zijn?

  2. wat als e er niet was? dan ? duidelijk is c niet het antwoord. a en b zullen gc doen voor de hele applicatie (vraag vereist voor één object). Ik denk dat het d is omdat finalize () vlak voor gc wordt genoemd (maar is het nodig dat na finalize gc wordt aangeroepen?) Of heb ik ongelijk? e moet er zijn om deze vraag te beantwoorden?


34
2017-11-03 03:52


oorsprong


antwoorden:


Antwoord E is het juiste antwoord. Als E er niet is, zult u snel te weinig geheugen hebben (of) Geen goed antwoord.

Object moet onbereikbaar zijn om in aanmerking te komen voor GC. JVM zal meerdere scans en bewegende objecten van de ene generatie naar een andere generatie uitvoeren om de geschiktheid van GC te bepalen en maakt het geheugen vrij als de objecten niet bereikbaar zijn.


49
2017-11-03 03:53



Om te verduidelijken waarom de andere antwoorden niet werken:

  1. System.gc() (samen met Runtime.getRuntime().gc(), wat exact hetzelfde doet) hints dat je wilt dat dingen worden vernietigd. Vaag. De JVM is vrij om verzoeken om een ​​GC-cyclus te negeren, te negeren als hij er geen behoefte aan ziet. Plus, tenzij je alle bereikbare verwijzingen naar het object hebt genegeerd, zal GC het toch niet aanraken. Dus A en B zijn beiden gediskwalificeerd.

  2. Runtime.getRuntime.gc() is slechte grammatica. getRuntime is een functie, geen variabele; je hebt er haakjes achter nodig om het te bellen. Dus B is dubbel gediskwalificeerd.

  3. Object heeft geen delete methode. Dus C is gediskwalificeerd.

  4. Terwijl Object  doet heb een finalize methode, het vernietigt niets. Alleen de garbage collector kan een object daadwerkelijk verwijderen.  (En in veel gevallen doen ze dat technisch gezien niet eens dat; ze kopiëren het gewoon niet wanneer ze de anderen doen, dus het blijft achter.) Allemaal finalize geeft een object een kans om op te ruimen voor de JVM gooit het weg. Wat meer is, zou je nooit moeten bellen finalize direct. (Als finalize is beschermd, de JVM zal het je hoe dan ook niet toestaan ​​om een ​​willekeurig object te gebruiken.) Dus D is gediskwalificeerd.

  5. Naast dat alles, object.doAnythingAtAllEvenCommitSuicide() vereist dat de lopende code verwijst naar object. Dat alleen al maakt het "levend" en komt dus niet in aanmerking voor garbagecollection. Dus C en D zijn dubbel gediskwalificeerd.


23
2017-11-03 04:16



Kort antwoord - E

Antwoord isE aangezien de rest duidelijk fout is, maar ..

Lang antwoord - Het is niet zo eenvoudig; het hangt er van af ...

Eenvoudig feit is dat de vuilnisman nooit zal besluiten om elk voorwerp dat een levensvatbare kandidaat is voor verzameling, te verzamelen, tenzij de geheugendruk extreem hoog is. En dan is er het feit dat Java net zo vatbaar is voor geheugenlekken zoals elke andere taal, ze zijn gewoon moeilijker te veroorzaken, en dus moeilijker te vinden als je ze veroorzaakt!

Het volgende artikel bevat veel goede details over hoe geheugenbeheer werkt en niet werkt en wat er door wat wordt ingenomen. Hoe generational Garbage Collectors werkenen Bedankt voor het geheugen (begrijpen hoe de JVM native geheugen gebruikt op Windows en Linux)

Als je de links leest, denk ik dat je het idee zult krijgen dat geheugenbeheer in Java niet zo eenvoudig is als een meerkeuzevraag.


14
2017-11-03 04:09



Zet op nul. Dan zijn er geen referenties meer en wordt het object elligabel voor Garbage Collection. GC verwijdert het object automatisch van de heap.


6
2017-10-30 00:26



Hier is de code:

public static void main(String argso[]) {
int big_array[] = new int[100000];

// Do some computations with big_array and get a result. 
int result = compute(big_array);

// We no longer need big_array. It will get garbage collected when there
// are no more references to it. Since big_array is a local variable,
// it refers to the array until this method returns. But this method
// doesn't return. So we've got to explicitly get rid of the reference
// ourselves, so the garbage collector knows it can reclaim the array. 
big_array = null;

// Loop forever, handling the user's input
for(;;) handle_input(result);
}

3
2018-04-28 12:33



In java is er geen expliciete manier om afval te verzamelen. De JVM zelf voert enkele threads uit op de achtergrond, controleert of de objecten geen verwijzingen bevatten, wat betekent dat alle manieren waardoor we toegang tot het object hebben verloren zijn. Aan de andere kant komt een object ook in aanmerking voor garbage collection als het zonder scope komt te staan, het programma waarin we het object hebben gemaakt is beëindigd of beëindigd.      Op uw vraag komt de methode definitief te zijn hetzelfde als de destructor in C ++. De finalisatiemethode wordt feitelijk aangeroepen vlak voordat het objectgeheugen door de JVM wordt gewist. Het is aan jou om de finalisatiemethode te definiëren of niet in je programma. Als de garbagecollection van het object echter wordt uitgevoerd nadat het programma is beëindigd, zal de JVM geen beroep doen op de finalisatiemethode die u in uw programma hebt gedefinieerd.     Je vraagt ​​je misschien wat het gebruik van de finaliseermethode is?    Laten we bijvoorbeeld bedenken dat je een object hebt gemaakt dat wat vereist naar een extern bestand streamen en je hebt expliciet een methode voor het finaliseren gedefinieerd voor dit object, die controleert of de stream is geopend voor het bestand of niet en als dit niet het geval is, wordt de stream gesloten. Stel dat je na het schrijven van meerdere regels code de verwijzing naar het object hebt verloren. Dan komt het in aanmerking voor garbage collection. Wanneer de JVM op het punt staat om de ruimte van uw object te bevrijden, heeft de JVM gewoon gecontroleerd of u de finalisatiemethode wel of niet hebt gedefinieerd en roept de methode aan zodat er geen risico is voor de geopende stream. afrondingsmethode maakt het programma risicovrij en robuuster.


0
2018-03-19 15:38