Tôi cần phải đi sâu bao nhiêu trong ngăn xếp cuộc gọi trước khi nhận được StackOverflowError? Câu trả lời có phụ thuộc vào nền tảng không?Độ sâu tối đa của ngăn xếp cuộc gọi java là gì?
Trả lời
Nó phụ thuộc vào lượng bộ nhớ ảo được cấp phát cho ngăn xếp.
http://www.odi.ch/weblog/posting.php?posting=411
Bạn có thể điều chỉnh này với tham số -Xss
VM hoặc với các nhà xây dựng Thread(ThreadGroup, Runnable, String, long)
.
Và có lẽ kích thước của các khung ngăn xếp bạn đang đặt trên đó? – duffymo
Giới hạn cũng phụ thuộc vào mức sử dụng ngăn xếp trong chức năng. –
nếu chúng ta không đề cập đến Xss thì sao? –
Kích thước ngăn xếp có thể được đặt bằng công tắc dòng lệnh -Xss
nhưng theo quy tắc chung, nó đủ sâu, hàng trăm nếu không phải hàng nghìn cuộc gọi sâu. (Mặc định là nền tảng phụ thuộc, nhưng ít nhất 256k ở hầu hết các nền tảng.)
Nếu bạn gặp lỗi tràn, 99% thời gian do lỗi trong mã.
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 ngăn xếp tràn xảy ra sau 8900 cuộc gọi, đôi khi chỉ sau 7700, 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();
}
}
Đó không phải là trường hợp đó là đuôi đệ quy và không bao giờ nên tràn? Chỉnh sửa: Xin lỗi. Trong Java nó bị rơi ở 8027; ở Scala nó lên đến 8594755 trước khi tôi chán. – arya
@arya một phần quan trọng của ngữ nghĩa JVM là việc đệ quy đuôi không được hỗ trợ. Điều này mang lại rất nhiều vấn đề thú vị cho những ai muốn thực hiện ngôn ngữ với đệ quy đuôi trên JVM. –
'public foo() {try {foo(); } cuối cùng {foo(); }} ' có thể chạy 'hầu như' mãi mãi, chỉ trong java. – Felype
Hãy so sánh hai cuộc gọi sau đây:
(1) phương pháp 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 pháp không tĩnh nhờ sủ dụng một lớp học khác nhau:
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 có public int testRecursion(int number) {
làm phương pháp duy nhất.
- 1. Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá trong một cuộc gọi setTimeout
- 2. Truy cập ngăn xếp cuộc gọi Java
- 3. Kích thước ngăn xếp tối đa C/C++
- 4. Google Chrome: Cách gỡ lỗi các lỗi "Kích thước ngăn xếp tối đa cuộc gọi tối đa" ngẫu nhiên
- 5. Kích thước ngăn xếp cuộc gọi tối đa vượt quá trong JSON.stringify (navigator)
- 6. JSpec - RangeError: Kích thước ngăn xếp cuộc gọi tối đa vượt quá
- 7. RangeError: Kích thước ngăn xếp cuộc gọi tối đa vượt quá
- 8. Làm cách nào để tăng kích thước ngăn xếp cuộc gọi tối đa trong Node.js
- 9. Mức độ kế thừa tối đa trong java là gì?
- 10. Android: Tăng kích thước ngăn xếp cuộc gọi
- 11. Điều hướng ngăn xếp cuộc gọi Java trong Eclipse
- 12. Ngăn xếp tràn từ đệ quy sâu trong Java?
- 13. Chụp nhanh ngăn xếp cuộc gọi
- 14. Cách kiểm tra ngăn xếp cuộc gọi
- 15. độ dài tối đa của html textbox là gì
- 16. Mức ngăn xếp quá sâu trong các cuộc gọi lại đang kích hoạt
- 17. Cuộc gọi Collections.checkedList() trong java là gì?
- 18. Ngăn xếp ngăn xếp là gì?
- 19. Stack so với Heap trong Javascript? (Đã vượt quá kích thước ngăn xếp cuộc gọi tối đa)
- 20. Chrome: Cách giải quyết lỗi "Kích thước ngăn xếp cuộc gọi tối đa đã vượt quá" trên Math.max.apply (Math, array)
- 21. Python sched.scheduler vượt quá độ sâu đệ quy tối đa
- 22. UnsafeQueueUserWorkItem và chính xác "không tuyên truyền ngăn xếp cuộc gọi" nghĩa là gì?
- 23. WCF Đọc tối đa Ngoại lệ Độ sâu
- 24. kích thước của ngăn xếp trong VC++ là gì?
- 25. Mức ngăn xếp quá sâu trong Ruby
- 26. đa hình cuộc gọi
- 27. Cửa sổ ngăn xếp cuộc gọi luôn trống
- 28. Ngăn xếp Linux là gì?
- 29. "Sắp xếp ngăn xếp" là gì?
- 30. Ngăn xếp LAMP là gì?
Liên quan chặt chẽ: http://stackoverflow.com/questions/794227/how-to-know-about-outofmemory-or-stackoverflow-errors-ahead-of-time – finnw
Vì đây là một câu hỏi hay, tôi đã cập nhật tiêu đề cho một cái gì đó tôi cảm thấy rõ ràng hơn liên quan đến ý nghĩa. (Trước đây tôi nghĩ bạn có thể đề cập đến chiều sâu của một ngăn xếp * cụ thể * mà bạn đã nắm bắt trong thời gian chạy, ví dụ). Vui lòng thay đổi lại nếu bạn không đồng ý. –
@Andrzej - không phản đối. – ripper234