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異常。
廣告
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP