爆內(nèi)存

爆內(nèi)存 - Memory issue

收集不到的崩潰日志?

做iOS的都知道,爆內(nèi)存導(dǎo)致的閃退是無法收集的。如何定位這個(gè)問題,一般都是使用蘋果提供的工具:Allocation 和 VM Tracker.使用的前提是,必須要連著電腦,無法通過這種手段定位線上的爆內(nèi)存問題。

在iOS系統(tǒng)上,誰負(fù)責(zé)kill 掉程序釋放內(nèi)存?

從這篇文章:No pressure, Mon!
可以了解到,它叫:Jetsam. 在以下兩種情況,程序會(huì)被kill掉。

loading.png
  • HWM - High Water Mark . Jetsam針對(duì)設(shè)備設(shè)定的單進(jìn)程最大內(nèi)存閥值,當(dāng)應(yīng)用占用內(nèi)存超過最大內(nèi)存閥值,就會(huì)被kill掉。

  • 在系統(tǒng)內(nèi)存緊張的時(shí)候,Jetsam會(huì)殺死一些優(yōu)先級(jí)低的進(jìn)程直到內(nèi)存不再緊張,進(jìn)程優(yōu)先級(jí)是系統(tǒng)內(nèi)核根據(jù)進(jìn)程的狀態(tài)以及進(jìn)程占用的物理內(nèi)存評(píng)估的,顯然,進(jìn)程的內(nèi)存占用越大,優(yōu)先級(jí)就會(huì)越低.

應(yīng)用占用的內(nèi)存越高,退到后臺(tái)就越容易被kill!當(dāng)用戶切換到程序A,再切換程序B。程序B居然重新啟動(dòng)了,這時(shí)候,用戶會(huì)一臉懵逼。

loading.png

內(nèi)存有分類嗎?

  1. Clean Memory
  • System framework
  • Binary executable of your app
  • Memory mapped files
  1. Dirty Memory
  • 所有非Clear Memory,系統(tǒng)無法回收 (Heap allocations,decompressed images,caches)
  1. Virtual Memory
  • 虛擬內(nèi)存 ,它由 Clean Memory + Dirty Memory
  1. Resident Memory
  • 真正消耗的內(nèi)存,它由 Dirty memory + Clean memory that loaded in physical memory

VM Tracker 沒有顯示數(shù)據(jù)的話,通過點(diǎn)擊右邊的控制面板:Automatic Snapshotting 。重新啟動(dòng)就可以看到了

vmSize.png

它們的關(guān)系:

virtual memory == (clean memory + dirty memory) > resident memory > dirty memory


heap.png

爆內(nèi)存的解決方案?

除了在應(yīng)用內(nèi)采取一系列的清理內(nèi)存以及優(yōu)化內(nèi)存使用的操作,但是dirty的內(nèi)存是沒有辦法處理的,只會(huì)累積。因此,確定程序哪里產(chǎn)生了dirty的內(nèi)存至關(guān)重要! 目前想到的方法是:Hook 系統(tǒng)底層堆內(nèi)存及VM內(nèi)存分配的相關(guān)方法,記錄每一個(gè)內(nèi)存塊的分配信息,包括分配堆棧、累計(jì)分配次數(shù)、累計(jì)分配內(nèi)存。在內(nèi)存超過一定的閥值時(shí)候,將這些信息dump到本地磁盤。

TODO : 如何不影響正常使用的前提下,高效的hook系統(tǒng)底層方法!

參考資料

VM Tracker 詳解

內(nèi)存分類

Instrument VMTracker

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容