main
入口函數開始執行代碼,在執行代碼的過程當中,會建立對象和一些局部變量,其中對象存放在堆中,變量存放在棧上,以上五個區中只有堆是由程序員本身建立和銷燬,而其餘四個都是系統本身管理。因此從低地址到高地址的的內存區域分別是代碼區、常量區、全局區、堆區和棧區。棧區用來存放局部變量,先進後出,一旦出了做用域就會被銷燬。程序員不須要管理棧區變量的內存。棧區變量的大小是由上到下分配的,因此先聲明的變量地址比後聲明的變量地址要大。棧區存儲在應用程序容許的內存空間的最上面。程序員
棧是向低地址擴展的數據結構,是一塊連續的內存的區域。是棧頂的地址和棧的最大容量是系統預先規定好的,棧的大小是2M(也有的說是1M,總之是一個編譯時就肯定的常數 ) ,若是申請的空間超過棧的剩餘空間時,將提示overflow。所以,能從棧得到的空間較小。markdown
存儲每個函數在執行的時候都會向操做系統索要資源,棧區就是函數運行時的內存,棧區中的變量由編譯器負責分配和釋放,內存隨着函數的運行分配,隨着函數的結束而釋放,由系統自動完成。(函數的調用是在棧中完成的)這塊也能夠叫作函數幀,從這裏也能夠引伸出另一個名詞叫作棧幀數據結構
棧幀:是指函數(運行中且未完成)佔用的一塊獨立的連續內存區域 函數
通常由程序員分配釋放,若程序員不釋放,程序結束時可能由OS回收(通常釋放後對應的指針應該指向NULL
若是沒有指向NULL
就會出現野指針)。注意它與數據結構中的堆是兩回事,分配方式相似於鏈表。堆區的變量地址是由下往上分配的,因此在同一線程中先聲明的變量地址要比後聲明的變量地址小。spa
堆是向高地址擴展的數據結構,是不連續的內存區域。這是因爲系統是用鏈表來存儲的空閒內存地址的,天然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。因而可知,堆得到的空間比較靈活,也比較大。操作系統
堆在系統中的申請流程:線程
優缺點:指針
代碼驗證 code
全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域,程序結束後有系統釋放orm
注意:全局變量和靜態變量仍是少用,全局變量和靜態變量的生命週期是存在整個程序的,因此大量的使用全局變量和靜態變量運行內存會增長
常量區用來存放常量字符串等,程序結束後由系統釋放
字符串常量由於可能在程序中被屢次使用,因此在程序運行以前就會提早分配內存且生命週期同程序的生命週期
存放函數的二進制代碼