Der GarbageCollektor

Moch

Bekanntes Mitglied
Hallo Leute,

Ich habe da mal eine (mehr oder weniger) Theorie-Frage zum GarbageCollektor bzw. dessen Funktionsweise.

Folgende Situation:
In einem Multiagenten-Simulationsframework wird eine Klasse "SpawnPoint" definiert. Im Zuge der Initialisierung von Agenten, gibt diese Klasse ihre Parameter an alle zugehörigen Agenten weiter und ist damit nach der Initialisierung der Agenten unnötig.

Meine Frage dazu jetzt: Räumt der GarbageCollector diese Objekte dann weg und bleiben diese erhalten.
Erzeugt werden die Agenten im folgenden Part der main():

Java:
...
for(int i=0; i<agentNumber; i++){
   Agent a = new Agent(
      SpawnList[localCounter].position,
      SpawnList[localCounter].party,
      SpawnList[localCounter].possibleEquipment,
      SpawnList[localCounter].objectives);
      [...weitere Parameter anderer Herkunft...]
}
...

Der localCounter wird hier lediglich zur Gleichverteilung der Agenten auf die Punkte benötigt.

Würden die Objekte vom Typ SpawnPoint nach der Initialisierung jetzt vernichtet werden oder bleiben Sie als Referenzpunkt erhalten?

Ist jetzt nur eine Frage, die mich interessiert.

Beste Grüße
Moch
 

Timothy Truckle

Top Contributor
Würden die Objekte vom Typ SpawnPoint nach der Initialisierung jetzt vernichtet werden oder bleiben Sie als Referenzpunkt erhalten?
Schwer zu sagen, in Deinem Code wird kein Objekt der Klasse SpawnPoint angezeigt. Wenn der Ausschnitt selbst in SpawnPoint liegt kann man die Frage immer noch nicht beantworten.

Allgemein gilt, dass der GC alle Objekte wegräumt, die vom aktiven Code aus nicht mehr erreichbar sind:
Java:
SpawnPoin sp = new SpawnPoint("1");
sp.spawnAgents();
sp = new SpawnPoint("2"); // CG räumt  SpawnPoint("1") beim nächste lauf weg.

bye
TT
 
Zuletzt bearbeitet:

Der Müde Joe

Top Contributor
Der GarbageCollector räumt Objekte weg, welche nicht mehr referenziert werden. Solange eine Referenz darauf existiert passiert nichts.

>SpawnPoint

Sehe ich nicht im Code.

Wenn du das Objekt direkt referenzierst, dann bleibst, sonst wird irgendwann weggeräumt.


EDIT:
How Garbage Collection works in Java
An Object becomes eligible for Garbage collection or GC if its not reachable from any live threads or any static refrences in other words you can say that an object becomes eligible for garbage collection if its all references are null.
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Kommt drauf an, wo der SpawnPoint definiert wurde, also in welchem Scope. War es in jenem, von wo aus die Methode zum initialisieren der Agenten aufgerufen wurde, dürfte er nichtmal auf dem Heap (sondern auf dem Stack) angelegt worden sein und wäre damit schon beim verlassen dieses Scopes Geschichte und damit nicht mal mehr ein Fall für den GC. Der GC kümmert sich nur um die Objekte auf dem Heap. Auf dem Heap werden grösstenteils nur Objekte angelegt, die in mehreren Scopes sichtbar sein können und jedes Objekt wird auf ein Set aller Scopes in denen es verwendet wird gemapped (Objekt-Referenzen). Ist dieses Set leer, wird das Objekt vom GC abgeräumt, sobald dieser sich anschickt mal aufzuräumen. Letzteres macht er nur, wenn der Speicher knapp wird.
Seit Java7 und der verbesserten Escape-Analysis landen immer weniger Objekte auf dem Heap, wodurch auch der GC entlastet wird.
 

Oben