# Variablen Speicher wieder freigeben ?



## mrjavanoob (12. Aug 2008)

Hallo Leute,

Ich habe eine Variable festgelegt und möchte diese aktualisieren. Jetzt ist die Frage ob der Speicher freigeben wird.
Hier ein Beispiel, Vector wird erst als Datenfeld angelegt.


```
private Vector v;

public void aktualisieren(){
   v = new Vector();
   v = "irrgendwelche neuen Daten";
}
```

Wenn die Referenz von v auf nen neuen Vector gelegt wird ist dann der alte Vector aus v noch im Speicher ?


----------



## Guest (12. Aug 2008)

mrjavanoob hat gesagt.:
			
		

> Wenn die Referenz von v auf nen neuen Vector gelegt wird ist dann der alte Vector aus v noch im Speicher ?


Nur bis der GarbageCollector es aufräumt. Sagen wir mal, nein, nicht mehr.


----------



## Guest (12. Aug 2008)

Nocht etwas, das gilt nicht, wenn das Vector noch irgendwo sonst referenziert wird. Anders ausgedrückt, es bleibt so lange im
Speicher, solange mindestens eine Stelle im Programm existiert, die eine referenz darauf hält.


----------



## Wildcard (12. Aug 2008)

Anonymous hat gesagt.:
			
		

> Anders ausgedrückt, es bleibt so lange im
> Speicher, solange mindestens eine Stelle im Programm existiert, die eine referenz darauf hält.


Genauer: eine *starke* Referenz


----------



## mrjavanoob (12. Aug 2008)

Also nur nochmal zum Verständnis:
Also ich kann so oft aktualisieren ausführen und in der aktualisieren Methoden dem Vector verschieden Daten geben, wie ich will ohne das jedesmal ein neuer Vector im Speicher rumirrt.

v wird praktisch immer überschrieben ?


----------



## Guest (12. Aug 2008)

Jajn. Der alte wird zwar verworfen, das geschieht aber nicht plötzlich, sondern mit einer 
kleinen Verzögerung. Zum dem Zeitpunkt, wo du es ersetzts, sind zwei unterschiedliche Instanzen 
im Speicher. Der GarbageCollector räumt es früher oder später auf. Da solche Aufräumarbeiten
Zeit kosten, wird versucht sie zu minimieren. Wenn es gerade nicht nötig erscheint, da genug
Speicher zur Verfügung steht, kann es durchaus längere Zeit im Speicher bleiben, ist aber
für dich im Programm nicht mehr erreichbar.


----------



## Guest (12. Aug 2008)

Noch ein Beispiel. Es ist ähnlich wie das Löschen von Dateien. Nur der Verweis, die Referenz, wird entfernt bzw. für nicht mehr erreichbar deklariert, die Daten sind aber noch eine Weile da, bis der Platz für andere Sachen genutzt
bzw. überschrieben wird.


----------



## Ark (12. Aug 2008)

Wildcard hat gesagt.:
			
		

> Anonymous hat gesagt.:
> 
> 
> 
> ...


... Es gibt nämlich noch die Möglichkeit, schwache Referenzen zu erzeugen. Das Verhältnis ist dabei ähnlich dem von "normalen" Threads zu Daemon-Threads: Wenn alle "normalen" Threads tot sind, verschwinden automatisch auch die Daemon-Threads. In Entsprechung: Wenn alle starken Referenzen auf ein Objekt verloren sind, wird automatisch auch die schwache Referenz auf dasselbe Objekt aufgegeben. (So habe ich das zumindest in Erinnerung.)

Ark


----------



## Guest (12. Aug 2008)

Ark hat gesagt.:
			
		

> Wildcard hat gesagt.:
> 
> 
> 
> ...


Meinst du nicht, dass es hier zu weit geht?


----------



## Wildcard (12. Aug 2008)

Es gibt harte Referenzen und dann noch Weak, Soft und Phantom Referenzen.
Weak: der GC darf aufräumen wenn es keine starken Referenzen mehr gibt
Soft: wird zum Caching verwendet. Der GC räumt das Objekt erst auf, wenn der Speicher anderweitig gebraucht wird
Phantom: Dient primär dazu, denn Status eines Objekts zu tracken, also mitzubekommen wenn es der GC einsammelt.


----------

