流程圖(后面附上)
malloc基本原理
在iOS App進程地址空間的各個區(qū)域中,最靈活的就要屬堆區(qū)了,它為進程動態(tài)分配內存,也是我們經常和內存打交道的地方唐全。
通常,我們會在需要新對象的時候蕊玷,進行 [NSObject alloc]調用邮利,而釋放對象時需要release(ARC會自動幫你做到這些)。
而這些alloc垃帅、release方法的調用延届,通常最終都會走到libsystem_malloc.dylib的malloc()和free()函數(shù)這里。libsystem_malloc.dylib是iOS內核之外的一個內存庫贸诚,我們App進程需要的內存方庭,先回請求到這里,但最終libsystem_malloc.dylib也都會向iOS的系統(tǒng)內核發(fā)起申請酱固,映射實際內存到App進程的地址空間上械念。
從蘋果公開的malloc源碼上來看,malloc的原理大致如下:
malloc內存分配基于malloc zone运悲,并將內存分配按大小分為nano龄减、tiny、small班眯、large幾種類型希停,申請時按需進行最適分配
malloc在首次調用時烁巫,初始化default zone,在64位情況下宠能,會初始化default zone為nano zone程拭,同時初始化一個scalable zone作為helper zone,nano zone負責nano大小的分配棍潘,scalable zone則負責tiny、small和large內存的分配
每次malloc時崖媚,根據(jù)傳入的size參數(shù)亦歉,優(yōu)先交給nano zone做分配處理,如果大小不在nano范圍畅哑,則轉交給helper zone處理肴楷。