網頁

2018/3/8

Java StackOverFlowError的發生原因

當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廣告,感恩。


沒有留言:

張貼留言