Java中的StackOverflowError和OutOfMemoryError有什麼區別?


每次執行Java程式時,作業系統都會為JVM分配一些記憶體。JVM將此記憶體分為兩部分。一個是棧記憶體,另一個是堆記憶體。棧用於方法的執行,堆用於儲存物件。當棧滿時,JVM會丟擲java.lang.StackOverflowError異常;當堆滿時,JVM會丟擲java.lang.OutOfMemoryError異常。

StackOverflowError

  • 棧用於方法的執行。對於每個方法呼叫,都會在棧記憶體中建立一個塊。
  • 與方法相關的資料(如引數、區域性變數或物件引用)都儲存在此塊中。
  • 當方法執行完畢後,此塊會從棧中移除,連同其中儲存的資料一起。
  • 每次呼叫方法時,它都必須完成執行並離開棧記憶體。
  • 如果方法停留在棧中,則棧將被填滿,JVM將丟擲java.lang.StackOverflowError異常。

OutOfMemoryError

  • 在Java中建立的物件儲存在堆記憶體中。當不再需要物件時,必須將其從記憶體中移除。
  • 垃圾收集器會從堆記憶體中移除不需要的物件。
  • 如果我們的物件具有活動引用,則垃圾收集器不會移除它們。它只移除那些沒有活動引用的物件。
  • 每次呼叫方法時,它都必須完成執行並離開棧記憶體。
  • 如果堆記憶體中沒有空間用於新物件,則JVM將丟擲java.lang.OutOfMemoryError異常。

更新於:2020年2月6日

940 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始
廣告
© . All rights reserved.