iOS底層原理以內存五大區

在iOS中,內存主要分爲:棧區堆區全局區(靜態區)常量區以及代碼區等五大區,本文主要分析這五大區。markdown

棧區分析

什麼是棧

  • 棧是系統數據結構,其對應的線程或進程是惟一的
  • 棧是從高地址向低地址擴展的數據結構
  • 棧是一塊連續的內存區域,遵循先進後出原則
  • 棧的地址空間是以0x7開頭
  • 棧是在運行時開闢

棧的存儲

  • 棧是由編譯器自動建立和釋放的
  • 存儲局部變量,一旦離開做用於就會銷燬釋放
  • 存儲函數參數,包括隱藏函數,好比(id self, SEL _cmd)

棧的優缺點

  • 優勢:因爲是編譯器自動建立和釋放的,因此不會產生內存碎片一塊連續的內存區域,因此查找速度快
  • 缺點:因爲是一塊連續的內存區域,因此存儲空間大小有限制
    • iOS主線程默認是1M,其餘線程是512kb,實際上咱們也能夠經過線程的stackSpace去修改,可是成本有些大

堆區

定義

  • 堆是從低地址向高地址擴展數據
  • 堆的內存區域是不連續的,方便增、刪、改,相似鏈表
  • 堆遵循先進先出FIFO原則
  • 堆的地址空間是以0x6開頭
  • 堆通常是在運行時分配內存

特色

  • 變量經過newallocmallocrealloc生成的內存放在堆區
  • 因爲是運行時開闢,且內存區域是不連續的,致使容易出現內存碎片
  • 因爲iOS目前都是ARC管理內存,因此通常無需手動釋放

全局區(靜態區)

全局區(靜態區)是編譯時分配的內存區域。在iOS中通常以0x1開頭,在程序運行時一直存在,直到程序結束釋放空間。數據結構

  • 已初始化的全局變量和靜態變量存放在一塊區域,未初始化的全局變量和靜態變量存放在另外一塊區域
  • static修飾的變量成爲靜態變量,該變量內存放在全局區(靜態區),由程序編譯時建立。
  • static能夠修飾局部變量也能夠修飾全局變量

常量區

常量區是一塊比較特殊的存儲區,常量區裏面存放的是常量,常量字符串就存放在常量區。 常量區的內存在編譯階段完成分配,程序運行時會一直存在內存中,只有當程序結束後纔會由操做系統釋放。函數

代碼區

存放可執行代碼的二進制文件區,它在程序編譯時存入,只可讀不可寫spa

總結

棧區、堆區內存空間是運行時分配的,所以隨着程序運行而變化;在iOS中堆區的內存是應用程序共享的,堆區的內存分配是系統負責的。全局區(靜態區)、常量區、代碼區是在編譯時分配,是固定的不可變的。操作系統

相關文章
相關標籤/搜索