2017-09-14 3 views
-1

Also habe ich ein Objekt, das bestimmte Variablen benötigt, um instanziiert zu werden. Diese Variablen werden über ein Array von Objekten an das Objekt übergeben. Dann wird jedes Element im Array einer internen Variablen zugewiesen.Objektvariable nach Instanziierung löschen

Ruft dieses Array nach dem Zuweisen der internen Variablen Garbage Collection ab, und das Array wird nie wieder referenziert oder sollte es manuell ausgeführt werden?

Speicher ist irgendwie wichtig, weil ich ein paar hundert dieser Objekte plus den Rest des Codes erstellen muss.

+1

Speicher ist nicht wichtig, wenn über einige hundert Objekte gesprochen wird. Sie machen sich Gedanken über Speicher, wenn jedes Objekt mehrere Megabyte benötigen würde; oder wenn du viele Millionen Objekte hast. Es sei denn, Sie sind in einer solchen Größenordnung (und Sie haben echte Probleme) ... Fragen, da dies darauf hinweist, dass Sie nicht verstehen, was Java-Speicherprobleme wirklich sind. – GhostCat

Antwort

3

Ob das Array für GC berechtigt ist, hängt von dieser Bedingung:

  • Gibt es etwas Referenzierung noch das Array?

Wenn Sie so etwas wie dieses:

public class Foo { 
    private int[] myArray = {1, 2, 3, 4}; 
    YourObject obj; 

    public void someMethod() { 
     obj = new YourObject(myArray); 
    } 
} 

Dann ist myArray nicht für die Garbage Collection berechtigt, da die Variable myArray im Foo Objekt noch es verweist. Sie können dann myArray auf null setzen, um es für GC geeignet zu machen. jedoch

Wenn myArray waren eine lokale Variable:

public class Foo { 
    YourObject obj; 
    public void someMethod() { 
     int[] myArray = {1, 2, 3, 4}; 
     obj = new YourObject(myArray); 
    } 
} 

Dann ist es, die für GC nach someMethod zurückkehrt, weil myArray bis dahin außerhalb des Gültigkeitsbereichs gegangen wird.

Beachten Sie auch, dass "berechtigt für GC" nicht bedeutet "wird sofort gesammelt werden". Es bedeutet nur, dass der GC eine Möglichkeit hat, ihn in Zukunft zu sammeln. Wann genau? Wir wissen es nicht.

+0

Und im Allgemeinen ist es uns egal wann. Wenn diese Werte wirklich gelöscht werden müssen, würde ich das Array nach der Verwendung mit "0" füllen.(So ​​verwenden wir 'char []' für das Passwort) – AxelH

0

ich Ihren Code gehe davon aus sieht wie folgt aus

//Client class 
o.setValues(arrayOfObjects); 
//In the receiving object 
public void setValues (Object[] objects){ 
// Dostuff 
} 

Zwei Dinge für arrayOfObjects sein ein Kandidat für die GC passieren müssen -

  1. arrayOfObjects Bedürfnisse außerhalb des Gültigkeitsbereichs zu gehen. ODER
  2. ArrayOfObject muss einen anderen Wert oder null zugewiesen werden.

Wenn Sie wirklich besorgt über das Gedächtnis sind, würde ich vermuten es, den Inhalt des Arrays ist, das müssen Müll gesammelt werden, nicht das Array selbst. Der Inhalt wird durch das empfangende Objekt eindeutig referenziert, so dass kein Müll gesammelt wird. Hoffe, das hilft.

Verwandte Themen