1. 程式人生 > 其它 >Java一維陣列記憶體解析

Java一維陣列記憶體解析

圖片均來自尚矽谷課件。

上圖給出java程式執行時的記憶體分配。圖中有棧,堆,方法區,各區域分別儲存的資料有:

  • 棧:儲存區域性變數;
  • 堆:儲存new出的物件
  • 方法區
    • 常量池:字元常量,如字串;
    • 靜態域:靜態變數

上圖中中的語句均是在某個方法中執行,方法中的變數即為區域性變數,因此一維整數陣列ages和字串陣列names均在棧中儲存。

區域性變數代表的陣列均是new出的物件,所以在堆中儲存。

int[] ages = new int[4];
ages[0] = 12;
ages[1] = 23;
ages[2] = 33;

執行上述程式碼時,區域性變數ages入棧,在堆中分配儲存四個整數元素的連續空間,並初始化為0。將該連續地址空間的首地址與ages一起儲存在棧中。整形陣列的初始化方式為動態初始化:陣列的初始化和陣列元素的賦值分開進行。

當執行賦值語句ages[0] = 12時,根據棧中的首地址在堆中找到該元素所在位置並使用12替換0。

String[] names = new String[]{"趙宇", “張愷”, "江運", "曹林"};
names[1] = "劉昭";

上述程式碼的執行過程如第一個程式碼塊執行過程一樣,只不過是堆中分配的連續記憶體空間儲存的是字串。初始化字串陣列的方式為靜態初始化,陣列的初始化與陣列元素的賦值操作同時進行。

names = new String[]{"Tom","Jerry"};

在執行第二個程式碼塊之後再執行上述語句時,堆中會另外分配出一塊連續的記憶體空間,儲存字串陣列的元素。但是這塊連續的記憶體空間與第二個程式碼塊分配的記憶體空間是獨立的,且此時棧中names對應的地址是新分配的記憶體空間的首地址(0x9999)。0x8999為首的記憶體空間此時沒有引用,在GC掃描後會被收集。

這裡堆中分配的儲存字串陣列的地址空間實際上存的不是字串。後續會糾正,在此只需直觀上理解為字串陣列的地址空間即可。

以上就是Java一維陣列的記憶體解析,如果不當指出,還請指出。

本文來自部落格園,作者:凸雲,轉載請註明原文連結:https://www.cnblogs.com/jasonXY/p/15244930.html