當JVM(Java Virtual Machine)執行thread時所消耗的stack記憶體超過上限時,便會發生StackOverFlowError
錯誤。
Java的方法參數(method parameters)物件參照或方法內的原始型別變數會存放在JVM的stack記憶體,當thread呼叫一個方法時stack會被建立,而該方法的參數及在方法內產生的本地原始型別變數會被存放在JVM的stack區,如果此時stack記憶體不足便會發生StackOverFlowError
錯誤。
注意僅有原始型別資料(primitive type data)及物件參照(object reference address)會存在stack區,而方法內產生的物件則是存在heap區。當方法執行結束後stack變會被釋放。
而通常引起StackOverFlowError
的原因是方法被無限制的遞迴(recursive call),也就是方法中的參數及本地變數不斷地被產生並放在stack記憶體直到耗盡。
例如底下的程式中recursive(int num)
因為不斷地被呼叫,每一次遞迴的本地原始型別變數都被放到stack,所以最終導致StackOverFlowError
。
Exception in thread "main" java.lang.StackOverflowError
public class Main {
public static void main(String[] args) {
recursive(1);
}
public static void recursive(int num) {
recursive(++num);
}
}
如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。
沒有留言:
張貼留言