Seberapa dalam saya harus masuk ke tumpukan panggilan sebelum saya mendapatkan StackOverflowError? Apakah platform jawaban bergantung?
Seberapa dalam saya harus masuk ke tumpukan panggilan sebelum saya mendapatkan StackOverflowError? Apakah platform jawaban bergantung?
Jawaban:
Itu tergantung pada jumlah memori virtual yang dialokasikan ke tumpukan.
http://www.odi.ch/weblog/posting.php?posting=411
Anda dapat menyetel ini dengan -Xssparameter VM atau dengan Thread(ThreadGroup, Runnable, String, long)konstruktor.
Saya menguji sistem saya dan tidak menemukan nilai yang konstan, terkadang stack overflow terjadi setelah 8900 panggilan, terkadang hanya setelah 7700, nomor acak.
public class MainClass {
private static long depth=0L;
public static void main(String[] args){
deep();
}
private static void deep(){
System.err.println(++depth);
deep();
}
}
public foo() { try { foo(); } finally { foo(); } }dapat berjalan 'secara virtual' selamanya, di java saja.
StackOverflowErrorterjadi setelah 8792
Ukuran tumpukan dapat diatur dengan -Xsssaklar baris perintah tetapi sebagai aturan praktis, itu cukup dalam, ratusan jika tidak ribuan panggilan. (Standarnya bergantung pada platform, tetapi setidaknya 256k di sebagian besar platform.)
Jika Anda mendapatkan stack overflow, 99% waktunya disebabkan oleh kesalahan dalam kode.
Bandingkan dua panggilan ini:
(1) Metode statis:
public static void main(String[] args) {
int i = 14400;
while(true){
int myResult = testRecursion(i);
System.out.println(myResult);
i++;
}
}
public static int testRecursion(int number) {
if (number == 1) {
return 1;
} else {
int result = 1 + testRecursion(number - 1);
return result;
}
}
//Exception in thread "main" java.lang.StackOverflowError after 62844
(2) Metode non-statis menggunakan kelas yang berbeda:
public static void main(String[] args) {
int i = 14400;
while(true){
TestRecursion tr = new TestRecursion ();
int myResult = tr.testRecursion(i);
System.out.println(myResult);
i++;
}
}
//Exception in thread "main" java.lang.StackOverflowError after 14002
Uji kelas rekursi memiliki public int testRecursion(int number) {satu-satunya metode.