記憶體五大區域
- 暫存器:CPU 內部,程式不可控。
- 本地方法區:Native 方法服務區。
- 方法區:類資訊、常量、靜態變數、即時編譯代碼。
- 棧內存:儲存局部變數,作用域結束自動釋放,線程私有。
- 堆內存:儲存陣列與物件(
new 出來的實體),有首地址、預設初始化值、GC 管理。
堆內存預設初始化值速查
| 型別 | 預設值 |
| 整數 | 0 |
| 浮點數 | 0.0 / 0.0f |
| boolean | false |
| 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]);
}
}
步驟圖解
文字流程說明
- 棧內存為
main 方法分配棧幀。
- 棧幀中為局部變數
arr(引用)分配槽位。
- 堆內存分配
int[3] 實體,自動初始化為 {0,0,0}。
- 將陣列首地址賦值給棧中的
arr 引用變數。
- 修改
arr[2] = 5,堆中實體數據變更。
- 讀取
arr[2] 並輸出到控制台。
關鍵提示
- 陣列長度必須確定才能在堆中分配空間。
- 堆實體自動初始化;棧局部變數不自動初始化,未賦值直接使用編譯報錯。
- 引用變數值類似
[I@hashcode:[ 表示陣列,I 表示 int,@ 後為哈希碼換算地址。
常見陣列異常
- ArrayIndexOutOfBoundsException:訪問不存在角標,編譯通過、運行拋出。
- NullPointerException:引用為
null 仍操作實體,編譯通過、運行拋出。