我得到StackOverflowError之前需要進入調用堆棧多深?答案平臺是否依賴?Java調用堆棧的最大深度是多少?
78
A
回答
48
這取決於分配給堆棧的虛擬內存量。
http://www.odi.ch/weblog/posting.php?posting=411
您可以用-Xss
VM參數或用Thread(ThreadGroup, Runnable, String, long)
構造調整這個。
+12
也許你正在放置的堆棧幀的大小? – duffymo 2011-01-19 10:26:54
19
堆棧大小可以使用命令行開關-Xss
進行設置,但作爲一個經驗法則,它足夠深入,深度數以百計(如果不是數千次)。 (默認值是與平臺相關的,但至少在大多數平臺256K)
如果你得到一個堆棧溢出的它是由在代碼中的錯誤導致99%的時間。
21
我測試了我的系統上,並沒有發現任何恆定值,有時棧有時只有後7700,隨機數後8900個調用發生溢出。
public class MainClass {
private static long depth=0L;
public static void main(String[] args){
deep();
}
private static void deep(){
System.err.println(++depth);
deep();
}
}
2
比較這兩個調用:
(1)的靜態方法:
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)使用不同類的非靜態方法:
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
測試遞歸類有public int testRecursion(int number) {
作爲唯一的方法。
相關問題
- 1. 調用堆棧已超過最大的100深度,Lua的
- 2. 獲取調用堆棧的深度GCC
- 3. 堆棧上聲明的最大允許大小是多少?
- 4. 遞歸調用堆棧深度
- 5. 調用堆棧深度:Xcode 4.6.3
- 6. 打印深度調用堆棧
- 7. iphone os支持的最大堆大小和堆棧大小是多少?
- 8. QEMU引導錯誤:「Swapper使用最大堆棧深度」
- 9. 堆棧缺少遞歸調用Java的
- 10. 最大調用堆棧大小
- 11. 在Java中減少運行時的最大堆棧大小
- 12. 最大長度是多少?
- 13. Rust是否暴露調用堆棧深度?
- 14. 「Uncaught RangeError:最大調用堆棧大小超過」java環境primefaces
- 15. 可以分配給進程的堆棧段的最大大小是多少?
- 16. java集最大堆棧大小
- 17. 超過最大調用堆棧
- 18. 最大調用堆棧超過
- 19. Nodejs RangeError超過最大調用堆棧
- 20. Node.js最大調用堆棧超出
- 21. 最大調用堆棧優於
- 22. 程序最大調用堆棧超過
- 23. 最大調用堆棧超過jQuery $ .each()
- 24. 調試堆棧深度過深,在Ruby中
- 25. 深度優先搜索堆棧使用
- 26. 是否可以刪除最大調用堆棧大小?
- 27. 遞歸 - 調用堆棧失敗測試的最大堆棧大小
- 28. 堆棧指針的值是多少?
- 29. 訪問計劃中的調用堆棧深度
- 30. 在setTimeout調用期間超出最大調用堆棧大小
密切相關:http://stackoverflow.com/questions/794227/how-to-know-about-outofmemory-or-stackoverflow-errors-ahead-of-time – finnw 2011-01-19 10:35:13
由於這是一個很好的問題,我已經將標題更新爲我認爲與意義更加明確相關的內容。 (以前我以爲你可能指的是你在運行時捕獲的*特殊堆棧的深度)。如果您不同意,請隨時更改。 – 2011-01-19 11:28:24
@Andrzej - 沒有異議。 – ripper234 2011-01-19 11:55:16