Array von Objekten, wie schauts im Heap / Stack aus ?

JavaFuzzi

Mitglied
Hallo 🙂

also soweit mir bekannt:

Heap beinhaltet, u. a. Referenz - & Instanzvariablen.

Stack beinhaltet Objekte.

(Soweit richtig?)


Jetzt meine Frage:

Angenommen wir haben ein Array von Objekten (instantiiert mit new), also nicht von primitiven Datentypen (integer, double o.ä.), so gibt es eine Referenzvariable, die auf die 1. Adresse des Arrays zeigt (gut die gibt es auch bei den primitiven Datentypen).

Wo liegt diese Referenzvariable? (Ich gehe vom Heap aus)

Jetzt liegt in jedem "Platzhalter" ( [0] [1] ... ) des Arrays eine Referenzvariable, die auf das jeweilige Objekt zeigt.

Wo liegen diese Referenzvariablen? (Ich tippe auf Heap, aber habe keine Ahnung)

Die Objekte selbst liegen im Stack ?


Bitte klärt mich auf ! Danke an euch wie immer 🙂


Zur Veranschaulichung, habe ich das hier noch:

0715.jpg


Gruuß
 
Zuletzt bearbeitet:
Moin,

also soweit mir bekannt:
Heap beinhaltet, u. a. Referenz - & Instanzvariablen.
Stack beinhaltet Objekte.
(Soweit richtig?)

so würde ich es nicht sehen! Der Unterschied zwischen beiden Speicherbereichen liegt (im Wesentlichen) in der Art der Speicheranforderung (dynamisch oder automatisch) !

Dynamischer Speicher ? Wikipedia
7. Memory : Stack vs Heap
memory management - What and where are the stack and heap? - Stack Overflow

Gruß
Klaus
 
Ich blick nicht ganz durch, was du womit meinst, deswegen sag ich einfach wie es afaik ist, ohne auf deine Aussagen einzugehen:

Der Stack enthält lokale Variablen, Methodenparameter und die Aufrufshierarchie (Stacktrace) der Methoden. Pro Thread gibt es einen Stack. Im Stack liegen nur primitive Datentypen und Referenzen auf Objekte (und Arrays).

Der Heap enthält die Objekte. Durch die Klasse wird der Aufbau eines Objekts im Speicher festgelegt, sprich wo welche Variable innerhalb der Datenstruktur liegt. (Wie Klassenvariablen gehandhabt werden hab ich allerdings keine Ahnung). Im Heap liegen auch Arrays, da diese nichts anderes sind als eine besondere Art von Objekt, die einzelnen Felder des Arrays enthalten dann entweder primitive Daten oder Referenzen auf andere Objekte im Heap.

Die Links die VfL_Freak gepostet hat beziehen sich soweit ich das sehen konnte allerdings auf C und sind deswegen nicht 1 zu 1 auf Java übertragbar, in erster Linie wegen des automatischen Speichermanagments von Java und den nichtvorhandenen Pointern aus C.
 
Moin,

Die Links die VfL_Freak gepostet hat beziehen sich soweit ich das sehen konnte allerdings auf C und sind deswegen nicht 1 zu 1 auf Java übertragbar, in erster Linie wegen des automatischen Speichermanagments von Java und den nichtvorhandenen Pointern aus C.
Aber natürlich gibt es auch in Java ein dynamisches Speichermanagement 😛ueh:
bspw.:
Java:
public byte[] myBuffer = new byte[123];

Gruß
Klaus
 
Ich glaube er meint folgendes:

Java:
void irgendeiineMethode()
{
    einObject object = new einObject();
}

Dieses Object ist zunächst mal local. Es könnte also durchaus auf dem Stack liegen.

wenn er nun folgendes macht

Java:
class irgendeineKlasse
{
     ArrayList<einObject> list=new ArrayList<einObject>();

    void irgendeiineMethode()
    {
        einObject object = new einObject();
        list.add(object);
        return;
    } 
}

wo liegt dann das Object? Es muss ja eigentlich vom Stack runter in den Heap,denn sonst wäre es ja nach dem return nicht mehr da. Wird also das Object dann direkt im Heap angelegt oder wird es beim add in den Heap kopiert oder was?

Gruß

Claus
 
Zuletzt bearbeitet:
Moin,

Java:
void irgendeiineMethode()
{
    einObject object = new einObject();
}
Dieses Object ist zunächst mal local. Es könnte also durchaus auf dem Stack liegen.
Tut es IMHO aber nicht nicht, da der Speicher DYNAMISCH angefordert wurde!

wenn er nun folgendes macht
Java:
class irgendeineKlasse
{
     ArrayList<einObject> list=new ArrayList<einObject>();

    void irgendeiineMethode()
    {
        einObject object = new einObject();
        list.add(object);
        return;
    } 
}
wo liegt dann das Object? Es muss ja eigentlich vom Stack runter in den Heap,denn sonst wäre es ja nach dem return nicht mehr da. Wird also das Object dann direkt im Heap angelegt oder wird es beim add in den Heap kopiert oder was?
Auch hierbei wird "object" im heap angelegt, da es sich um eine dynamische Speicheranforderung handelt!!
Es wird aber nach dem "return" NICHT vom Garbage Collector entfernt, da es ja in der ArrayList noch eine Referenz darauf gibt!!
Erst wenn die ArrayList vom GC entfernt wird, dann wird auch "object" aus den Speicher entfernt!

Gruß
Klaus
 
Zuletzt bearbeitet:
Moin,

ist aber so - bei allen Programmiersprachen !
Nur die jeweiligen Befehle (rsp. Mechanismen) zur dynamische Speicheranforderung sind unterschiedlich!
Beispiele:
  • C: "malloc" und "free" (jew. Funktionsaufrufe)
  • C++: "new" und "delete" (jew. Funktionsaufrufe)
  • Java: "new" und automatisches Garbage Collection !!

Hier nochmal scnell zwei weitere Links:
Tutorial / Java Grundlagen / dynamische Speicherverwaltung
https://blog.codecentric.de/2011/03/java-speicher-konfiguration-und-uberwachung-3-akt/

Gruß
Klaus
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben