Garbage Collection

hdi

Top Contributor
Hey,

aus gegebenem Anlass (Thread eines anderen Users) bin ich mal wieder dazu gekommen mich mit dem GC zu beschäftigen. Dabei ist mir aufgefallen dass noch viele Fragezeichen über meinem Kopf schweben. Siehe Bild:
:D So, nach etwas googlen bin ich noch verwirrter, jetzt versteh ich gar nix mehr und suche Hilfe bei euch!

Erstmal: Der GC bereinigt nur den Heap, nicht den Stack, nicht wahr?

Frage: Was genau liegt auf dem Heap, was auf dem Stack? Das ganze googlen hat mich da total irritiert. Ich dachte bisher der Stack speichert primitive Daten, der Heap Objekte. Wobei die Frage ist was ist mit primitiven Instanzvariablen von Objekten Oo.
Jetzt hab ich aber gelesen der Stack speichert lokale Variablen. Hä? Was bleibt dann für den Heap noch übrig, jede Instanz wird irgendwo lokal erstellt - okay mal die statischen Variablen ausgenommen.

Der Stack bereinigt sich anscheinend selber, sobald der enstprechende Code-Block beendet wird, d.h. lokale Variablen werden aufgelöst. Aber nur die Variablen, also die Referenz, aber nicht das Objekt selber oder? Das liegt auf dem Heap und wird vom GC geschnappt?

Und woher weiss der GC ob sowas noch gebraucht wird? Man sagt sobald etwas nicht mehr referenziert wird. Aber:

Java:
new Thread(){
  public void run(){
      while(true){...}
  }
}.start();

Dieses Objekt wird nicht referenziert im Code - der GC beendet den Thread ja trotzdem nicht, auch wenn die Methode verlassen wurde die dieses Objekt erstellt hat. Was wird da alles gecheckt bei einem Objekt, bevor es zerstört wird?
Oder hat irgendwie jeder Thread seinen eigenen Stack/Heap??

Das ist alles so verwirrend :autsch:

Also:
1) Was beinhaltet der Stack?
2) Was beinhaltet der Heap?
3) Gibt es von denen vllt mehrere bei mehreren Threads?
3) Was bereinigt der GC?
4) Woher weiss er, was er zerstören soll und was nicht? Nur an der Referenzierung kann es nicht liegen, s.o.

Ich danke vielmals!
 

XHelp

Top Contributor
Bei den Fragen über GC muss ich leider passen, da ich selber nicht so tief in der Thematik bin. Zu dem Rest (ist eher grobe Darstellung).
Heap gibt es eins pro Prozess, Stack gibt es pro Thread. Im Stack sind solche Sachen gespeichert wie Argumente der Methoden, Adressen für den Callback, lokale Variablen. Heap ist für globale und vor allem dynamische Sachen. Stack-Größe ist begrenzt. Dem Heap wird zwar auch eine bestimmte größe zugewiesen, die kann sich aber dynamisch erweitern.
Vllt noch wichtig, dass Stack auf LIFO Prinzip aufbaut, so dass der Zugriff nicht beliebig ist.

[EDIT]
Nur so als Vermutungen:
Da die größe vom Stack begrenz ist und der Zugriff nicht "eben so das 8. Element löschen" ist würde ich mal stark vermuten dass der GC Tatsächlich nur den Heap bereinigt.
Wie er das genau macht ist einge gute Frage... vermutlich läuft es ähnlich ab wie mit den Paging-Algorithmen, dass du noch zusätzliche Infos festhälst (wann zugegriffen, besteht noch referenz (wenn nicht sogar nur eine Bitmap bezogen auf "referenziert?")) und anfang dieser Infos entscheidet er sich welchen Bereich er als "frei" markiert. Denn "löschen" muss er das eigentlich nicht.
[/EDIT]
 
Zuletzt bearbeitet:

tfa

Top Contributor
Dieses Objekt wird nicht referenziert im Code - der GC beendet den Thread ja trotzdem nicht, auch wenn die Methode verlassen wurde die dieses Objekt erstellt hat. Was wird da alles gecheckt bei einem Objekt, bevor es zerstört wird?
Es wird nur gecheckt, ob es referenziert wird. Dein Thread wird referenziert. Schau dir mal den Quelltext von Thread.start() an.
 

hdi

Top Contributor
Schau dir mal den Quelltext von Thread.start() an.
Ok also der Thread wird durch die ThreadGroup referenziert, die durch den Thread referenziert wird? Darüber denk ich jetzt besser nicht weiter nach, kein Bock auf Hirnschlag und so :D
Aber okay, er wird wohl referenziert, das soll mir reichen.

Aber zum Thema Stack/Heap ist noch nicht alles geklärt.

Heap gibt es eins pro Prozess, Stack gibt es pro Thread.
Aha, danke!

Im Stack sind solche Sachen gespeichert wie Argumente der Methoden, Adressen für den Callback, lokale Variablen
.
Wenn wir hier von Argumenten und Variablen reden - sprechen wir hier vom Inhalt der Variablen, d.h. Referenzen, oder von den Objekten, die damit referenziert werden?

Heap ist für globale ..
global.. den Begriff gibt es in Java ja eig nicht. Was meinst du jetzt damit? Instanz/Klassenvariablen?

..und vor allem dynamische Sachen.
Was verstehst du darunter?^^

Thx
 

XHelp

Top Contributor
Wenn wir hier von Argumenten und Variablen reden - sprechen wir hier vom Inhalt der Variablen, d.h. Referenzen, oder von den Objekten, die damit referenziert werden?
Naja, im Speicher sind ja schon die Objekte, und nicht Referenzen auf den Speicher. Im Maschinencode greifst du dann mit Referenzen auf diese Bereiche zu.

global.. den Begriff gibt es in Java ja eig nicht. Was meinst du jetzt damit? Instanz/Klassenvariablen?
Was verstehst du darunter?^^
Ich denke mal, dass hat schon einen Grund, warum man die größe eine Arrays nicht ändern kann. Die oben genannten Definition habe ich irgendwann mal irgendwo mal gelesen. Dieses Prinzip ist ja auch schon etwas älter, deswegen kannst du da glaube ich nicht ohne weiteres Analogien zu OOP ziehen können. Rein von der Vorstellung her würde ich meinen, dass die primitiven Datentypen im Stack gespeichert werden (die größe steht ja fest), wo hingegen Objekte, dessen Größe sich ja dynamisch verändert in den Heap kommen.
 

Jedit

Aktives Mitglied
Also so im Groben was ich noch im Kopf hab:

Auf dem Stack sind die ganzen Referenzen, Variablen, etc. Auf dem Heap liegen Objekte.

Wenn du jetzt zB ein Object o = new Object(); anlegst, liegt die Referenz o auf dem Stack, das Objekt selbst auf das o zeigt liegt auf dem Heap.

Wenn du jetzt o = null; setzt, wird die Verbindung zum Objekt gelöscht. Du hast also keine Möglichkeit mehr das Objekt irgendwie anzusprechen (wenn das die einzige! Referenz auf das Objekt war). Daher wird es für den GC frei gegeben. Wenn er das nächste mal arbeitet, könnte er dieses Onjekt also entfernen.

Die Referenz selber bleibt jedoch, zwar auf null, aber sie bleibt.

Wann der GC arbeitet kann man btw auch nicht beeinflussen. Es gibt zwar eine methode die den Anschein erweckt als könnte man ihn aufrufen (vergessen wie die heißt) aber in Wirklichkeit sagt die Methode nur etwas in der Art wie "Wenn der GC das nächste mal arbeiten könnte und Speicher frei machen soll weil er knapp wird (aber noch nicht zwangsweise nötig), dann soll ers auch machen" ... Garantie, dass er arbeitet ist das allerdings keine.

mfg
 
Zuletzt bearbeitet:

hdi

Top Contributor
Rein von der Vorstellung her würde ich meinen, dass die primitiven Datentypen im Stack gespeichert werden (die größe steht ja fest), wo hingegen Objekte, dessen Größe sich ja dynamisch verändert in den Heap kommen.
Genau das dachte ich eben auch

Auf dem Stack sind die ganzen Referenzen, Variablen, etc. Auf dem Heap liegen Objekte.
Okay, das ist jetzt wieder ne andere Aussage - zumindest vielleicht :D
Was ist jetzt zB mit Instanz-Variablen? Die enthalten Referenzen, die liegen also auf dem Stack? Aber sie sind ja Teil eines Objekts, und das liegt auf dem Heap. Also... :bahnhof:
Und was meinen wir hier eig. mit "Objekt"? Ein Objekt, was ist das überhaupt im Speicher, einfach die Ansammlung aller Speicherbereiche die für seine Instanz-Variablen-Inhalte reserviert sind?

Wann der GC arbeitet kann man btw auch nicht beeinflussen. Es gibt zwar eine methode
System.gc() ;) Ich weiss das ist sowas wie repaint(), es ist nur ne Bitte, stimmt schon. (Wobei er der doch immer nachkommt in der Praxis eig., genauso wie beim repaint)
 

Jedit

Aktives Mitglied
Edit: Sorry, bevor ich da noch mehr Falsches schreib, geh ich mal ins Kino und wenn ich wiederkomm les ich erstmal in den Skripten nach, da stehts ganz genau drin ;)
 
Zuletzt bearbeitet:

hdi

Top Contributor
Okay das mit gc() hab ich auch mal in nem Test gesehen - hat da gut gefunzt.
Naja ok das ist ja jetzt nicht das Thema ;)

Gut - ich fasse mal zusammen:

Der Heap existiert nur 1x im Programm und enthält Objekte. Das heißt Daten eines komplexen Datentyps (Klassen- oder enum-Instanzen). Dabei ist es egal wo und ob diese Objekte nun in einer Variablen (ob nun Instanz- oder Klassenvariable ist egal) gespeichert sind.
Fakt ist sobald ein Objekt nicht mehr referenziert wird wird es vom GC geholt (theoretisch).

Der Stack existiert pro Thread 1x und enthält primitive Daten und - im Falle von Variablen mit kompelxem Typ - Referenzen. Allerdings nur die primitiven/Referenzen, die nicht in einer Instanz-Variable stecken, denn die liegen zusammen mit dem jeweiligen Objekt auf dem Heap.
D.h. in anderen Worten: Der Stack enthält alle primitiven Klassen-Variablen/Daten, sowie alle Referenzen aus Klassen-Variablen und lokalen Variablen/Parameter-Variablen.

Ist das so korrekt gesagt??

PS: Und - bitte nicht übel nehmen jetzt an die Poster ;) - bitte nur bestätigen/widerlegen wenn ihr es wisst.

thx
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Garbage Collection Frage Allgemeine Java-Themen 15
B Garbage Collection Logfile: Binary File Allgemeine Java-Themen 2
T Objekt der Garbage Collection zugaenglich machen? Allgemeine Java-Themen 7
F Frage zu Memory Leak, Garbage Collection und Profiler-Tools Allgemeine Java-Themen 6
M Wie lange dauert ein garbage collection Allgemeine Java-Themen 7
R Garbage Collection bei gegenseitiger Objektreferenz Allgemeine Java-Themen 2
M garbage collection Allgemeine Java-Themen 14
G Frage zur Garbage Collection Allgemeine Java-Themen 5
J Garbage collector Allgemeine Java-Themen 3
D Garbage Collector Allgemeine Java-Themen 3
A Garbage Collector Allgemeine Java-Themen 3
A Garbage Collector in NetBeans vs. exe Anwendung Allgemeine Java-Themen 33
L Garbage Collector lässt Programm kurz hängen Allgemeine Java-Themen 10
H2SO3- SCJP garbage collector frage Allgemeine Java-Themen 13
R Garbage Collector löscht anscheinend nichts Allgemeine Java-Themen 22
S Garbage Collector entlasten Allgemeine Java-Themen 2
JStickman Der Garbage Collector Allgemeine Java-Themen 13
P Threads ohne Referenz & der Garbage Collector Allgemeine Java-Themen 2
S garbage collector prog Allgemeine Java-Themen 4
S Threads <-> Garbage Collector Allgemeine Java-Themen 2
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
P Garbage Collector funktioniert nicht richtig? Allgemeine Java-Themen 12
M Problem mit garbage collector Allgemeine Java-Themen 19
M Garbage manuell loswerden Allgemeine Java-Themen 29
R Garbage Collector rennt die ganze Zeit Allgemeine Java-Themen 7
M Garbage Collector Allgemeine Java-Themen 5
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
JavaJüngling beliebige Collection die Comperable Elemente enthält als Parameter Allgemeine Java-Themen 37
W Collections Suche Collection, um Strings mit Indizees versehen Allgemeine Java-Themen 47
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
Y String-Collection: längste gemeinsame Strings / Prefixe Allgemeine Java-Themen 3
S Probleme mit Collection Allgemeine Java-Themen 7
S Passende Java Collection Allgemeine Java-Themen 5
D Eigene/r Collection/Container Allgemeine Java-Themen 3
K Collections Collection<> mit List<String> abgleichen? Allgemeine Java-Themen 10
D Beste Collection für Integer Allgemeine Java-Themen 4
H JPA (EclipseLink) Neuer Eintrag in Collection speichern (unidirektional) Allgemeine Java-Themen 3
M Collections Typ Variable einer generischen Collection ? Allgemeine Java-Themen 4
H Datentypen Collection für SQL-Datentypen Allgemeine Java-Themen 2
M collection persistence system Allgemeine Java-Themen 4
K associate collection with two open sessions Allgemeine Java-Themen 12
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
S Stilfrage bezüglich Beans mit Collection-Properties Allgemeine Java-Themen 2
B iText Portable Collection Acrobat X Allgemeine Java-Themen 2
S Eine Collection von Objekten mit LDAP Syntax filtern Allgemeine Java-Themen 5
Rudolf Aus Collection<Integer> eine Zahl machen Allgemeine Java-Themen 2
R Dateigestützte Collection für große Datenmengen Allgemeine Java-Themen 5
P Collection Tree Allgemeine Java-Themen 19
C Die schnellste Collection-Klasse ? Allgemeine Java-Themen 37
K Collection.contains()/retainAll() mit Referenzgleichheit statt equals()? Allgemeine Java-Themen 2
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
E Collection Problem Allgemeine Java-Themen 2
B Geordnete, begrenzte Collection Allgemeine Java-Themen 3
D [SOLVED] Collection wird nicht richtig per Konstruktor übernommen Allgemeine Java-Themen 8
S Wahl der Collection, unspezifizierte Elementtypen Allgemeine Java-Themen 4
D Map mit Collection Eigenschaften Allgemeine Java-Themen 9
S Innerer Type einer generischen Collection herausfinden? Allgemeine Java-Themen 13
B SBCC - Swing Better Components Collection - downloadlink ? Allgemeine Java-Themen 5
G Schnelligkeit einer Collection Allgemeine Java-Themen 12
V Collection in Collection Allgemeine Java-Themen 3
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
M Collection aufteilen Allgemeine Java-Themen 4
S Collection Type Allgemeine Java-Themen 8
S Probleme mit collection.containsAll Allgemeine Java-Themen 28
C Collection Multithreading? Allgemeine Java-Themen 33
vogella Überschreiben von equals und hashcode für Collection Allgemeine Java-Themen 7
T Hibernate Criteria Queries - Abfragen von Collection-Members Allgemeine Java-Themen 2
M Schnellste Collection/Liste Allgemeine Java-Themen 15
M Collection mit ArrayList Allgemeine Java-Themen 17
F mittels Collection<A> an A.class kommen? Allgemeine Java-Themen 7
L Welche Collection ist die richtige ? Listen mergen Allgemeine Java-Themen 3
B Collection Allgemeine Java-Themen 2
N Collection#retainAll(Collection<?> c) Allgemeine Java-Themen 3
R Objekttyp ermitteln das aus generischer Collection kommt Allgemeine Java-Themen 3
J Von Collection zu vector Allgemeine Java-Themen 5
P Welche Collection verwenden? Allgemeine Java-Themen 4
S Sortierung einer Collection nach dem Attribut "name&quo Allgemeine Java-Themen 3
C Collection Element ersetzen Allgemeine Java-Themen 5
C public boolean containsAll(Collection c) Allgemeine Java-Themen 2
C Collection, LinkedList, Elemente Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben