StackOverflowError bei Rekursion verhindern

Status
Nicht offen für weitere Antworten.

Schandro

Top Contributor
Hi,

ich hab ne Rekursion geschrieben, die sich extrem oft selbst aufruft, weswegen ich einen StackOverflowError bekomme. Es ist von mir aber gewollt, das die rekursion so tief geht und es gibt mmn. auch keinen anderen Weg, die Methode zu schreiben...
Gibt es eine Möglichkeit, Java zu sagen, dass er für einen bestimmten Aufruf keinen Stack schreiben soll?
 

tfa

Top Contributor
Nein, gibt es nicht. Dann würde ja gar nichts mehr funktionieren. Aber du kannst mit -Xss die Stackgröße erhöhen.
Sicher, dass du keine Endlosschleife gebaut hast?
 

EgonOlsen

Bekanntes Mitglied
Schandro hat gesagt.:
Gibt es eine Möglichkeit, Java zu sagen, dass er für einen bestimmten Aufruf keinen Stack schreiben soll?
Der Stack wird doch für die Rekursion benötigt. Nur wenn du keine Übergabeparameter hättest, hättest du keinen Stack...aber auch keinerlei Rekursion. Du kannst jede Rekursion auch Nicht-Rekursiv bauen. Erfordert je nach Problem etwas Überlegung, aber geht immer. Dann entfällt das Problem mit dem Stack.
 

musiKk

Top Contributor
Schandro hat gesagt.:
es gibt mmn. auch keinen anderen Weg, die Methode zu schreiben...
Man kann jede Rekursion auch als Iteration umschreiben. Muss natürlich nicht immer elegant oder einfach sein.

Gibt es eine Möglichkeit, Java zu sagen, dass er für einen bestimmten Aufruf keinen Stack schreiben soll?
Wie schon geschrieben wurde, geht das nicht. Es geht mit Compilern, die Endrekursion (tail recursion) unterstützen, aber die Java-Compiler gehören nicht dazu.
 

Schandro

Top Contributor
ok, danke für die Tipps. Ich werd versuchen es iterativ umzuschreiben, kann halt nur ein bisschen länger dauern bis ich das hinkriege^^.
 

tfa

Top Contributor
musiKk hat gesagt.:
Gibt es eine Möglichkeit, Java zu sagen, dass er für einen bestimmten Aufruf keinen Stack schreiben soll?
Wie schon geschrieben wurde, geht das nicht. Es geht mit Compilern, die Endrekursion (tail recursion) unterstützen, aber die Java-Compiler gehören nicht dazu.
Kannst du näher erläutern, was du damit meinst? Warum unterstützen Java-Compiler keine Endrekursion? Warum braucht man dann keinen Stack?
 

tfa

Top Contributor
Achso, es geht um die automatische Umwandlung endrekursiver Methoden in Iteration. Das war vielleicht etwas dumm ausgedrückt.
 

musiKk

Top Contributor
tfa hat gesagt.:
Warum unterstützen Java-Compiler keine Endrekursion?
Ok, es scheint doch eher mit den JVMs zusammenzuhängen. Bei LtU wird da ein wenig drüber diskutiert.

tfa hat gesagt.:
Das war vielleicht etwas dumm ausgedrückt.
Von wem?
Falls du mich meinst: Endrekursion ist ein gängiges Konzept in Compilern vor allem funktionaler Sprachen (aber auch der GCC produziert bei eingeschalteter Optimierung Code, der Endrekursion berücksichtigt). Auch nach der Erklärung des Begriffs hätte man nicht lange suchen müssen.
Andernfalls will ich nichts gesagt haben.
 

tfa

Top Contributor
Der Begriff Endrekursion ist mir schon bekannt. Deine (verkürzende) Aussage, "Java-Compiler unterstützen keine Endrekursion" hatte mich nur irritiert.
 

musiKk

Top Contributor
Ja. Mit der VM-Sache verschwimmen die Grenzen zwischen Interpretierung und reinem Compilat ja etwas. Normal hängt das am Compiler. Aber wenn die Aussage aus oben angegebener Diskussion stimmt, dass es in der JVM keine Möglichkeit für einen einfachen Sprung gibt (also quasi ein jmp in Assembler), dann liegt es wohl doch an der Spezifikation vom Bytecode. Aber mit Bytecode habe ich mich noch nicht so sehr beschäftigt, auch wenn ich das auch mal machen wollte.
 

tfa

Top Contributor
Also einen Byte-Code für goto gibt es schon. Es gibt ja auch unbedingte Sprünge in Java (break, continue).
Ich denke, dass die Endrekursionsauflösung eher in funktionalen Sprachen üblich ist als in imperativen. Rekursive Programmierung ist da ja sowieso essentiell. Von daher ist eine eingebaute Unterstützung dort eher zu finden als in Java.
 

musiKk

Top Contributor
Das stimmt schon. Nur weiß ich nicht, was dafür spricht, Endrekursion nicht zu berücksichtigen. Wie gesagt, der GCC machts und somit dürfte es auch für jede Sprache gehen, für die es ein GCC-Frontend gibt. Mit C gehts jedenfalls. Wollte es eigentlich auch noch mit dem gcj ausprobieren, aber der zog gleich wieder Unmengen an Abhängigkeiten mit sich, da hab ichs erstmal gelassen. ;)
 

Landei

Top Contributor
Scala hat eine einfache Form der End-Rekursion (eben soweit sich das mit der JVM realisieren lässt), also könnte das der Java-Compiler auch implementieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zeppi Rekursion StackOverflowError Allgemeine Java-Themen 4
Androbin Interpreter-Fehler Probleme mit Rekursion - StackOverflowError Allgemeine Java-Themen 8
S Stackoverflowerror Allgemeine Java-Themen 2
javaerd Binomialkoeffizient ausrechnen, Exception in thread "main" java.lang.StackOverflowError Allgemeine Java-Themen 6
G StackoverflowError beim laden einer FXMML Datei Allgemeine Java-Themen 1
G maven 3.1.1 StackOverflowError Allgemeine Java-Themen 3
A Binäre Suche im Array mit StackOverflowError Allgemeine Java-Themen 3
H StackOverflowError erst ab 87 Array Elementen Allgemeine Java-Themen 4
E Interpreter-Fehler StackOverflowError Allgemeine Java-Themen 3
M StackOverflowError Allgemeine Java-Themen 9
E StackOverflowError Allgemeine Java-Themen 8
F Stackoverflowerror beheben Allgemeine Java-Themen 5
U Kompilieren einer großen Datei if-else = StackOverflowError Allgemeine Java-Themen 4
J java.lang.StackOverflowError Debugging? Allgemeine Java-Themen 51
S StackOverflowError - Brett vor'm Kopf Allgemeine Java-Themen 6
T Profifrage: java.lang.StackOverflowError bei BigInteger Allgemeine Java-Themen 27
G StackOverflowError Allgemeine Java-Themen 6
F Warum StackOverFlowError? Allgemeine Java-Themen 6
P Rekursion Aufrufbaum Allgemeine Java-Themen 7
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
districon Rekursion und Dynamische Programmierung Allgemeine Java-Themen 2
J Rekursion Allgemeine Java-Themen 4
Zrebna Wie kann man endgültig aus einer Rekursion ausbrechen? Allgemeine Java-Themen 14
parrot Rekursion Aufgabe Allgemeine Java-Themen 12
B Rekursion Allgemeine Java-Themen 11
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
J Rekursion Mergesort Allgemeine Java-Themen 10
R Rekursion Allgemeine Java-Themen 3
R Programm zur Rekursion Allgemeine Java-Themen 5
V Rekursion Allgemeine Java-Themen 2
J Denkfehler Rekursion Allgemeine Java-Themen 5
I Raute mit Rekursion "zeichnen" Allgemeine Java-Themen 7
B Rekursion Allgemeine Java-Themen 2
B Rekursion Allgemeine Java-Themen 22
B Java Sternchen ausgeben mittels Rekursion Allgemeine Java-Themen 3
Hacer Rekursion- sumOfAllNodes Allgemeine Java-Themen 5
L Rekursion Binärbaum Allgemeine Java-Themen 7
Y Rekursion Allgemeine Java-Themen 19
M Permutation ohne Wiederholung mit rekursion Allgemeine Java-Themen 4
J Rekursion oder Iteration - verkettete Listen Allgemeine Java-Themen 8
T Pascalsches Dreieck ohne array und rekursion Allgemeine Java-Themen 9
P Rekursion Allgemeine Java-Themen 9
R Threading und Rekursion führen zu “GC overhead limit exceeded” Allgemeine Java-Themen 4
W Rekursion-Probleme mit return Allgemeine Java-Themen 35
C Rekursion Fibonacci Allgemeine Java-Themen 31
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
eQuest Rekursion Dauer Allgemeine Java-Themen 6
Weiti Swingworker und Rekursion Allgemeine Java-Themen 8
L fragwürdige Rekursion Allgemeine Java-Themen 4
L Kleine Rekursion Allgemeine Java-Themen 12
M Rekursion!! Allgemeine Java-Themen 8
J Rekursion in Schleifenkonstrukt wandeln Allgemeine Java-Themen 21
R Rekursion Ablauflogik Allgemeine Java-Themen 19
M Rückwärts geführte Rekursion Allgemeine Java-Themen 3
G Werte bei Rekursion viel höher als erwartet Allgemeine Java-Themen 3
G Rekursion - Denksport Allgemeine Java-Themen 6
S Rekursion und StackOverflow Allgemeine Java-Themen 11
P Stackoverflow in Rekursion. Bin ich schuld oder Java? Allgemeine Java-Themen 9
W kompliziertes Konstrukt von Schleifen/If/else. Rekursion? Allgemeine Java-Themen 22
S Rekursion Allgemeine Java-Themen 2
Linad Tiefe der Rekursion als Abbruchbedingung Allgemeine Java-Themen 6
Linad Zahlensysteme -> Rekursion Allgemeine Java-Themen 4
N Frage zu einer Rekursion Allgemeine Java-Themen 4
D Stackoverflow verhindern Allgemeine Java-Themen 4
T Fenster schließen verhindern Allgemeine Java-Themen 13
Z Überlauf des Javaspeichers verhindern Allgemeine Java-Themen 4
N Input/Output Verhindern, dass log-Einträge auf Console erscheinen Allgemeine Java-Themen 2
V JNI Call Crash verhindern (abfangen) Allgemeine Java-Themen 2
nrg Decompile verhindern Allgemeine Java-Themen 2
K HashMap sorting verhindern Allgemeine Java-Themen 10
H Mehrfachen Start des Programms verhindern Allgemeine Java-Themen 6
B Java OutOfMemory Error verhindern, Resourcenbedarf präventiv abschätzen? Allgemeine Java-Themen 19
T doppeltes Starten verhindern Allgemeine Java-Themen 14
B Exception bei leerem JTable verhindern Allgemeine Java-Themen 10
P Mehrere Instanzen der selben Appl. verhindern Allgemeine Java-Themen 12
J Wie die gleichzeitige Ausführung mehrerer Tasks trotz Multithreading verhindern? Allgemeine Java-Themen 2
T Mehrmaligen Start verhindern Allgemeine Java-Themen 19
Daniel_L Mehrfache Ausführung desselben Threads/Tasks verhindern? Allgemeine Java-Themen 4
V Zu schnelle Buttonklicks verhindern? Allgemeine Java-Themen 8
K Zeilenumbruch in Eclipse beim Codeformater verhindern Allgemeine Java-Themen 10
C Flimmern wegen eines Thread verhindern Allgemeine Java-Themen 8
M Acrobat Viewer Bean - EULA-Anzeige verhindern Allgemeine Java-Themen 4
G KeyListener: Wiederholtes Aufrufen von KeyPressed verhindern Allgemeine Java-Themen 3
reibi Doppelten Programmaufruf verhindern Allgemeine Java-Themen 11
S Verhindern das Programm mehrmals geöffnet wird Allgemeine Java-Themen 26
G Wie das Beenden eines Javaprogrammes verhindern? Allgemeine Java-Themen 6
F [TableModel] Doppelte einträge finden (bzw. verhindern) Allgemeine Java-Themen 3
P Mehrere Instanzen beim IE verhindern Allgemeine Java-Themen 11
thE_29 Escape Zeichen verhindern Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben