首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 記憶體劃分與程序運行時內存工作流程圖解

     編輯:Java 綜合教學

記憶體五大區域

  1. 暫存器:CPU 內部,程式不可控。
  2. 本地方法區:Native 方法服務區。
  3. 方法區:類資訊、常量、靜態變數、即時編譯代碼。
  4. 棧內存:儲存局部變數,作用域結束自動釋放,線程私有。
  5. 堆內存:儲存陣列與物件(new 出來的實體),有首地址、預設初始化值、GC 管理。

堆內存預設初始化值速查

型別預設值
整數0
浮點數0.0 / 0.0f
booleanfalse
char'\u0000'
引用型別null

全域變數 vs 局部變數

  • 局部變數:方法內定義,作用域結束自動釋放(棧)。
  • 全域變數(成員變數):方法外定義,隨物件生命週期(堆)。

程序運行時內存工作流程演示

代碼範例

class Demo2 {
    public static void main(String[] args) {
        int[] arr = new int[3];
        arr[2] = 5;
        System.out.print(arr[2]);
    }
}

步驟圖解

內存工作流程圖解

文字流程說明

  1. 棧內存為 main 方法分配棧幀。
  2. 棧幀中為局部變數 arr(引用)分配槽位。
  3. 堆內存分配 int[3] 實體,自動初始化為 {0,0,0}。
  4. 將陣列首地址賦值給棧中的 arr 引用變數。
  5. 修改 arr[2] = 5,堆中實體數據變更。
  6. 讀取 arr[2] 並輸出到控制台。

關鍵提示

  • 陣列長度必須確定才能在堆中分配空間。
  • 堆實體自動初始化;棧局部變數不自動初始化,未賦值直接使用編譯報錯。
  • 引用變數值類似 [I@hashcode:[ 表示陣列,I 表示 int,@ 後為哈希碼換算地址。

常見陣列異常

  1. ArrayIndexOutOfBoundsException:訪問不存在角標,編譯通過、運行拋出。
  2. NullPointerException:引用為 null 仍操作實體,編譯通過、運行拋出。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved