在Java中,正在執行的程式的每個介面、類別、物件、變數和方法都儲存在電腦記憶體的不同位置。堆是運行時儲存變數、方法和類別的值的記憶體區域的一部分。它的分配是動態發生的,並且可以根據應用程式的需求成長或縮小。另一方面,引用變數、方法和類別的名稱儲存在堆疊記憶體區域中。但是,如果由於某種原因未正確處理它們的分配,則可能會導致我們將在本文中討論的記憶體錯誤。
每當進程啟動時,它都會自動定義固定的堆疊大小。在每個方法呼叫期間,都會在呼叫堆疊上建立一個呼叫幀,並持續到方法呼叫結束為止。當電腦記憶體的堆疊空間中沒有剩餘空間用於新堆疊幀時,我們會遇到 StackOverflowError。
以下範例說明了 StackOverflowError
import java.lang.StackOverflowError; public class Overflw { public static void methodA(int n1) { n1++; methodB(n1); } public static void methodB(int n1) { n1++; methodA(n1); } public static void main(String []args) { int n1 = 0; methodA(n1); } }
Exception in thread "main" java.lang.StackOverflowError at Overflw.methodB(Overflw.java:10) at Overflw.methodA(Overflw.java:6) at Overflw.methodB(Overflw.java:10) at Overflw.methodA(Overflw.java:6) at Overflw.methodB(Overflw.java:10) at Overflw.methodA(Overflw.java:6) at Overflw.methodB(Overflw.java:10)
如您所看到的範例 1 程式碼的輸出,我們收到了 StackOverflowError。在這裡,我們創建了兩個名為「methodA」和「methodB」的參數化使用者定義方法。在主方法中,我們聲明了整型變數“n1”並將其初始化為 0,並使用參數“n1”呼叫“methodA” 。現在,“methodA”調用“methodB”,並增加了“n1”的值。同樣,“methodB”呼叫“methodA”,並且此過程會重複多次。因此,在某些時候,為此程式創建的堆疊大小會耗盡,從而導致以下錯誤。
我們可以採取以下措施來處理StackOverflowError
為重複的方法提供適當的終止條件
減少局部變數或陣列的大小也可能有所幫助。
重構程式碼以避免無限的方法呼叫。
現在,借助這個範例,我們將嘗試找到 StackOverflowError 的解決方案 發生在前面的範例中。
public class Overflw { public static void methodA(int n1) { n1++; methodB(n1); } public static void methodB(int n1) { n1++; int n2 = 5; int mult = n1 * n2; System.out.println("Value of n1 and n2 multiplication is: " + mult); } public static void main(String []args) { int n1 = 0; methodA(n1); } }
Value of n1 and n2 multiplication is: 10
在範例 1 中,程式碼的問題是第 6 行和第 10 行沒有終止。但在上面的範例中,我們給了一條終止程式並列印儲存在「mult」中的值的語句。
JVM 的「-Xmx」和「-Xms」兩個屬性決定了 Heap 的大小。此大小會影響值的儲存。當JVM由於堆記憶體部分空間不足而在值分配時遇到問題時,我們會遇到OutOfMemoryError
以下範例說明了 OutOfMemoryError。
public class MemoryErr { public static void main(String[] args) { String stAray[] = new String[100 * 100 * 100000]; } }
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at MemoryErr.main(MemoryErr.java:3)
在上面的程式碼中,我們分配的大小大於堆大小,因此,我們得到了 OutOfMemoryError
我們可以採取以下措施來處理OutOfMemoryError。
我們可以使用 -Xmx 和 -Xms JVM 選項來增加堆的大小
#使用適合應用程式行為的垃圾收集器也可能有所幫助。
以下範例說明如何使用 try 和 catch 區塊處理 OutOfMemoryError。
public class MemoryErr { public static void main(String[] args) { try { String stAray[] = new String[100 * 100 * 100000]; } catch(OutOfMemoryError exp) { System.out.println("Application reached Max size of Heap"); } } }
Application reached Max size of Heap
本文首先解釋了每個 Java 程式所需的兩個記憶體空間。在後面的部分中,我們討論了與堆疊和堆疊記憶體相關的錯誤
以上是Java中的堆疊和堆疊記憶體錯誤的詳細內容。更多資訊請關注PHP中文網其他相關文章!