StackOutOfMemory <-> HeapOutOfMemory

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

ich war immer der Meinung, das der Speicher für Objekte im Heap allokiert wird bis ich folgendes Programm ausgeführt habe:

Code:
package javaapplication29;

public class Main {


    public Main() {
        new Main();
        }

    public static void main(String[] args) {
        new Main();
    }

}

Am Stack wird ja nur Speicher für Methoden- Adresse, Rücksprungadresse usw. allokiert,
Ist das nicht richtig oder wie hängt das zusammen?

schönen Tag noch,
 
G

Guest

Gast
Was ist dann der Unterschied zwischen dem Stack und dem Heap in der Java Virtual Maschine?
 
S

Spacerat

Gast
Der Heap ist sozusagen der Hauptspeicher und der Stack ist ein Speicher für Rücksprung-Adressen bei Methoden-Aufrufen. Bei deiner unendlichen Rekursion ("new Main()" in "Main()") läuft der Stack erwartungsgemäss recht schnell über (wird voll). Villeicht sollte noch erwähnt werden, das der Stack natürlich Teil des Hauptspeichers ist.

mfg Spacerat
 
G

Guest

Gast
Dann versteh ich nicht warum ich oben eine Stack OutOfMemory- Exception bekomme, es gibt keine lokalen Variablen einer Methode und Rücksprungadresse gibt es offensichtlich auch kein.
Wie kann der SOF dann zustande kommen?
 
M

maki

Gast
Im Zusammenhang mit rekursion kann ein OutOfMemoryError immer vorkommen, vor allem wenn es zu einer Endlosrekursion führt wie in diesem Beispiel.
 
S

Spacerat

Gast
André Uhres hat gesagt.:
Btw: auch lokale Variablen einer Methode oder eines Blocks werden auf dem Stack angelegt,
also nicht nur der Befehlszeiger einer Methode (wenn sie durch den Aufruf einer anderen Methode
oder von sich selbst unterbrochen wird).
Naja... hast ja recht... fast jedenfalls. Wir unterhalten uns hier auf Java-Ebene. Deswegen landen auf dem Stack neben den für diesen Thread relevanten Rücksprung-Adressen ausschliesslich Primitivtypen und Zeiger (bzw. Referenzen). Der Unterschied zu anderen Programmiersprachen (C, C++, Asembler) ist riesig aber nicht Teil dieses Themas.

mfg Spacerat
 

Ebenius

Top Contributor
André Uhres hat gesagt.:
Ich wollte ja nur ergänzen. Variablen, die innerhalb eines Blockes festgelegt werden, sind lokal für diesen Block. Sie werden angelegt, wenn der entsprechende Block aufgerufen wird und im Programmcode des Blockes die Definition der Variablen erreicht wird. Lokale Variablen werden auf dem Stack angelegt. Beim Verlassen des Blocks, d.h. beim Erreichen der schließenden geschweiften Klammer, werden die lokalen Variablen wieder ungültig.
Das hängt allerdings von der Implementation der VM und vom Java Compiler ab. Die Blöcke müssen nur zur Kompilierzeit existieren. Wie der Compiler da optimiert, steht auf einem anderen Blatt.

Ebenius
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben