Tôi cần đi sâu bao nhiêu vào ngăn xếp cuộc gọi trước khi gặp lỗi StackOverflowError? Nền tảng câu trả lời có phụ thuộc không?
Tôi cần đi sâu bao nhiêu vào ngăn xếp cuộc gọi trước khi gặp lỗi StackOverflowError? Nền tảng câu trả lời có phụ thuộc không?
Câu trả lời:
Nó phụ thuộc vào số lượng bộ nhớ ảo được phân bổ cho ngăn xếp.
http://www.odi.ch/weblog/posting.php?posting=411
Bạn có thể điều chỉnh điều này bằng -Xsstham số VM hoặc với hàm Thread(ThreadGroup, Runnable, String, long)tạo.
Tôi đã thử nghiệm trên hệ thống của mình và không tìm thấy bất kỳ giá trị không đổi nào, đôi khi tràn ngăn xếp xảy ra sau 8900 cuộc gọi, đôi khi chỉ sau 7700, các số ngẫu nhiên.
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(); } }có thể chạy 'ảo' mãi mãi, chỉ trong java.
StackOverflowErrorxảy ra sau khi sau 8792
Kích thước ngăn xếp có thể được đặt bằng công -Xsstắc dòng lệnh nhưng theo quy luật chung, nó đủ sâu, hàng trăm nếu không muốn nói là hàng nghìn lệnh. (Mặc định là phụ thuộc vào nền tảng, nhưng ít nhất là 256k trong hầu hết các nền tảng.)
Nếu bạn gặp sự cố tràn ngăn xếp, thì 99% trường hợp là do lỗi trong mã.
So sánh hai lệnh gọi này:
(1) Phương thức tĩnh:
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) Phương thức không tĩnh sử dụng một lớp khác:
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
Kiểm tra lớp đệ quy public int testRecursion(int number) {là phương thức duy nhất.