乙個程序執行時,所占用的記憶體,可以分為如下幾個部分:
1、棧區(stack):由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。
2、堆區(heap):一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os **。
3、全域性變數、靜態變數:初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數
和未初始化的靜態變數在相鄰的另一塊區域。程式結束後有系統釋放。
4、文字常量:常量字串就是放在這裡的,程式結束後由系統釋放。
5、程式**:存放函式體的二進位制**。
下面我們看乙個例子程式:
int a = 0; 全域性初始化區
char *p1; 全域性未初始化區
main()
程式中的棧區對應於程序的棧段;
程式中的堆區對應於程序的堆段;
全域性變數、靜態變數因為其是可讀寫的,故儲存在程序的資料段;
文字常量、程式**因為其是唯讀的,故儲存在程序的**段。
程式執行時的記憶體
當乙個源 通過gcc編譯成a.out,執行a.out時 程式便開始了執行之旅 即程序 作業系統為程序分配堆疊空間,隨後把程式執行碼放入文字段,把程式經過初始化的全域性變數和靜態變數放入data 把程式為初始化的全域性變數和靜態變數放入bss段 並對bss段資料初始化為0 之後cpu 段指標指向mai...
程式執行時記憶體管理
1,管理執行階段記憶體空間分配 malloc new int pn new int 儲存的型別,記憶體根據此設定相應儲存位元組的記憶體 pn是記憶體位址 所以 當宣告乙個變數的指標變數時沒初始化,宣告後再來初始化則pn 接收的應該是變數在記憶體中的位址 variablename pn是儲存在記憶體的...
方法執行時記憶體變化
區域性變數 只在方法體中有效,方法結束之後,區域性變數的記憶體就釋放了 jvm三塊主要的記憶體 棧記憶體 堆記憶體 方法區記憶體 方法去最先有資料 方法區中存放 片段 clas位元組碼 堆記憶體 後面會學到 棧記憶體 方法呼叫的時候,該方法需要的記憶體空間在棧中分配 棧記憶體儲存方法執行時的記憶體空...