首頁 > Java > java教程 > Java中的堆疊和堆疊記憶體錯誤

Java中的堆疊和堆疊記憶體錯誤

PHPz
發布: 2023-09-01 20:09:11
轉載
1248 人瀏覽過

Java中的堆疊和堆疊記憶體錯誤

在Java中,正在執行的程式的每個介面、類別、物件、變數和方法都儲存在電腦記憶體的不同位置。堆是運行時儲存變數、方法和類別的值的記憶體區域的一部分。它的分配是動態發生的,並且可以根據應用程式的需求成長或縮小。另一方面,引用變數、方法和類別的名稱儲存在堆疊記憶體區域中。但是,如果由於某種原因未正確處理它們的分配,則可能會導致我們將在本文中討論的記憶體錯誤。

與堆疊相關的錯誤

每當進程啟動時,它都會自動定義固定的堆疊大小。在每個方法呼叫期間,都會在呼叫堆疊上建立一個呼叫幀,並持續到方法呼叫結束為止。當電腦記憶體的堆疊空間中沒有剩餘空間用於新堆疊幀時,我們會遇到 StackOverflowError。

範例 1

以下範例說明了 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

  • 為重複的方法提供適當的終止條件

  • 減少局部變數或陣列的大小也可能有所幫助。

  • 重構程式碼以避免無限的方法呼叫。

範例 2

現在,借助這個範例,我們將嘗試找到 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

範例 1

以下範例說明了 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 選項來增加堆的大小

  • #使用適合應用程式行為的垃圾收集器也可能有所幫助。

範例 2

以下範例說明如何使用 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中文網其他相關文章!

來源:tutorialspoint.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板