linux 記憶體管理淺談

來源:互聯網
上載者:User

前幾天程式佔用的記憶體超過20G後就異常退出了,溫習下程式關於記憶體的基本概念,特轉載一篇文章:

  
進程(執行的程式)會佔用一定數量的記憶體,它或是用來存放從磁碟載入的程式碼,或是存放取自使用者輸入的資料等等。不過進程對這些記憶體的管理方式因記憶體用
途不一而不盡相同,有些記憶體是事先靜態分配和統一回收的,而有些卻是按需要動態分配和回收的。對任何一個普通進程來講,它都會涉及到5種不同的資料區段。

下面我們來簡單歸納一下進程對應的記憶體空間中所包含的5種不同的資料區都是幹什麼的。

1)程式碼片段:程式碼片段是用來存放可執行檔的操作指令,也就是說是它是可執行程式在記憶體中的鏡像。程式碼片段需要防止在運行時被非法修改,所以只准許讀取操作,而不允許寫入(修改)操作——它是不可寫的。

2)資料區段:資料區段用來存放可執行檔中已初始化全域變數,換句話說就是存放程式靜態分配的變數和全域變數。

3)BSS段:BSS段包含了程式中未初始化的全域變數,在記憶體中 bss段全部置零。

4)堆(heap):堆是用於存放進程運行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當進程調用malloc等函數分配記憶體時,新分配的記憶體就被動態添加到堆上(堆被擴張);當利用free等函數釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)

它的實體記憶體空間是由程式申請的,並由程式負責釋放。

5)棧:棧是使用者存放程式臨時建立的局部變數,也就是說我們函數括弧“{}”中定義的變數
(但不包括static聲明的變數,static意味著在資料區段中存放變數)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,並且待到
調用結束後,函數的傳回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢複調用現場。從這個意義上講,我們可以把堆棧看成一個寄
存、交換

臨時資料的記憶體區。

它是由作業系統分配的,記憶體的申請與回收都由OS管理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.