現象:app占用內存50mb以下,崩潰,Xcode中的console提示內存問題
問題所在:看起來內存占用率不高,實際上app在瘋狂的alloc的同時,還快速的dealloc,所以內存保有量不高
詳解:
最近在一個帶有雙擊縮放功能的閱讀器,在大屏設備上雙擊縮放會崩潰。
崩潰時編譯器給出的信息就是Message from debugger: Terminated due to memory issue
但崩潰時內存使用還不到50mb,摔!
開始以為是圖片緩存的問題,於是去除圖片緩存,內存是不會隨着操作而增長了,但崩潰依然存在。
觀察到在小屏(320 * 640)手機上,隨着雙擊縮放,緩存的圖片越來越多,內存100mb+也沒有問題,但大屏去除緩存的情況下內存占用到50mb也會崩潰。
真是奇怪。
編譯器說是內存問題,但看起來跟占用內存也沒有直接聯系。
我不由的想到:聽說堆的尺寸增長的太快,也會導致內存警告崩潰,那要么就是這個原因 ?
經過一些探索和彎路,我發現instruments工具中有total bytes可以反應出總共占用的內存。
如圖所示,深顏色是當前占用,淺顏色是已經釋放了的
如果淺顏色部分增長過快(短時間占用、釋放很多內存)是會導致內存警告崩潰的
當然光短時間內占用很多內存也會導致崩潰,只是這樣的崩潰容易被發現。因為內存上去了。
有些對象生存周期很短,如果這樣的對象很多,那我們看到的就是,現內存占用量保持一個穩定狀態,但實際內存也許在被瘋狂的占用,只是被占用的內存隨即又被釋放。(core animate中就有這樣的例子,CA::Render::Shmem::new_shmem就可能會在1、2秒內共使用100mb+的內存,而內存占用量還會保持一個穩定水平線)