Auf dem Stack werden Parameter und lokale Variablen in einem Programm allokiert. Der Stack befindet sich typischerweise am oberen Ende des Adressraum. Ein Stack Overflow (zu Deutsch: "Stapelüberlauf") tritt auf, wenn man mehr Speicherplatz für Parameter/lokale Variablen anfordert als Stack-Space vorhanden ist.
In Java wird in diesem Fall ein StackOverflowError
(https://docs.oracle.com/javase/8/docs/api/java/lang/StackOverflowError.html) getriggert. Dieser Fehler tritt häufig bei rekursiven Funktionen auf. Führt man das Programm
public class StackOverflowError {
public static void main(final String... args) {
StackOverflowError.recursive(1);
}
public static void recursive(int n) {
if (n == 0) {
return;
} else {
recursive(n++);
}
}
}
erhält man die Fehlermeldung
Exception in thread "main" java.lang.StackOverflowError
Neben dem Stack gibt es auch den sogenannten Heap (Haufen), der ebenfalls speichertechnisch ausgereizt werden kann. Beispielweise liefert ein Aufruf der folgenden Primzahlprüffunktion
public static boolean is_prime(final int to_check) {
final String regex = "(..+?)\\1+|.?";
return !new String(new char[to_check]).matches(regex);
}
mit is_prime(1000000000);
folgenden Fehler:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space