小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

先弄清楚這里的學(xué)問,再來談iOS內(nèi)存管理與優(yōu)化(一)

 jlland 2016-03-07

author:Martin_wjl

address:http://www.jianshu.com/p/deab6550553a


remark:本文系原作者于[技術(shù)鳥]微信公眾號(hào)投稿授權(quán)首發(fā)

內(nèi)存有分類嗎?什么類型的內(nèi)存可以回收?

當(dāng)然具有分類

  • Clean Memory:在閃存中有備份,能夠再次讀取。主要包括system framework、binary executable of your app、memory mapped files

  • Dirty Memory:所有非Clean Memory,系統(tǒng)無法回收。包括Heap allocation、caches、decompressed images

內(nèi)存之間的關(guān)系是什么呢?

  • 虛擬內(nèi)存層面:virtual memory = clean memory dirty memory.

  • 物理內(nèi)存層面:resident memory= dirty memory clean memory that loaded in physical memory

  • 總結(jié)virtual memory == (clean memory dirty memory) > resident memory >dirty memory

你的程序有時(shí)候會(huì)因?yàn)橄到y(tǒng)內(nèi)存不足而被殺死,這個(gè)時(shí)候你應(yīng)該更多關(guān)注物理內(nèi)存層面。

虛擬內(nèi)存是做啥的?

我們?cè)谝胩摂M內(nèi)存之前,程序指令必須都在物理內(nèi)存內(nèi),這樣使得程序的大小被限制在物理內(nèi)存的大小以內(nèi)。事實(shí)上,有很多情況并不需要將整個(gè)程序放在內(nèi)存中。來看下面一個(gè)實(shí)例程序:

// clean memory
char *buf = malloc(100*1024*1024)

// dirty memory
for(int i=0; i < 3*1024*1024;   i){
    buf[i] = rand()
}

首先申請(qǐng)了100兆的虛擬內(nèi)存,操作系統(tǒng)很懶的,你申請(qǐng)了,但是你只要不用,我就不會(huì)給你分配物理內(nèi)存。后來for循環(huán)中,我們進(jìn)行讀寫,操作系統(tǒng)就會(huì)分配3兆的物理內(nèi)存,而其他97兆是在虛擬內(nèi)存。

所以虛擬內(nèi)存的使用,使得程序不再受物理內(nèi)存空間的限制,程序的地址不一定在內(nèi)存上,也可能在輔存上。用戶可以為一個(gè)巨大的虛擬空間地址編寫程序。

使用Allocations工具來驗(yàn)證剛才的說法

下面這個(gè)圖片,剛才已經(jīng)分析過了,對(duì)于虛擬內(nèi)存和物理內(nèi)存的占用應(yīng)該已經(jīng)了解到了。


我們把兩段代碼放在兩個(gè)Button下面,當(dāng)點(diǎn)擊button1就會(huì)觸發(fā)第一個(gè)函數(shù),當(dāng)點(diǎn)擊button2就會(huì)觸發(fā)第二個(gè)函數(shù)。

然后我們通過Instrument啟動(dòng)Allocations工具,啟動(dòng)程序后,可以看到最初的內(nèi)存分配情況如下:


All Heap & Anoymous VM可以一起來看,代表分配的所有虛擬內(nèi)存,Dirty Size就是剛才講的Dirty Memory,resident Size就是物理內(nèi)存的大小

然后點(diǎn)擊Button1,查看內(nèi)存情況,發(fā)現(xiàn)虛擬內(nèi)存增加100M,其他沒有變化


點(diǎn)擊Button2,查看內(nèi)存情況,發(fā)現(xiàn)物理內(nèi)存和Dirty Memory都增加了3M,同時(shí)虛擬內(nèi)存增加100M


虛擬內(nèi)存 VS 物理內(nèi)存

首先了解內(nèi)存抽象這么一個(gè)概念,我們的程序訪問的都是邏輯地址空間(也叫虛擬地址),邏輯地址需要經(jīng)過轉(zhuǎn)換之后才可以訪問到物理內(nèi)存。虛擬內(nèi)存到物理內(nèi)存的映射是怎樣的呢?

  • 主要是兩個(gè)寄存器在中間起到了強(qiáng)大的作用,界限寄存器用來判斷是否越界,如果沒有越界就會(huì)加上基址寄存器的值,轉(zhuǎn)換為物理內(nèi)存地址。


為什么桌面系統(tǒng)中很少有應(yīng)用因?yàn)閮?nèi)存過多而被Kill掉,但是iOS會(huì)呢?

對(duì)于桌面操作系統(tǒng),是具有豐富的輔存的,我們的操作系統(tǒng)可以使用置換機(jī)制(Swap)。比如說,我物理內(nèi)存緊張了,我就把我現(xiàn)在不用的進(jìn)程暫時(shí)置換到磁盤去,騰出空間給新的進(jìn)程,這樣就相當(dāng)于使用磁盤來擴(kuò)展物理內(nèi)存。


但是對(duì)于移動(dòng)設(shè)備(包括蘋果、安卓等),無Swap機(jī)制,主要是由于移動(dòng)設(shè)備的閃存容量很有限,并且閃存的頻繁讀寫很降低壽命。對(duì)于iOS使用的就是Kill掉優(yōu)先級(jí)低的進(jìn)程。下面一個(gè)問題進(jìn)行詳細(xì)闡述。

iOS內(nèi)存管理機(jī)制是怎樣的?基于什么原則來Kill掉進(jìn)程呢?

iOS使用的是低內(nèi)存處理機(jī)制Jetsam,這是一個(gè)基于優(yōu)先級(jí)隊(duì)列的機(jī)制。


從上往下,優(yōu)先級(jí)越來越高,看圖可以發(fā)現(xiàn),優(yōu)先級(jí)由低到高是:IDLE(空閑)->BACKGROUND->FOREGROUND,依次類推。當(dāng)內(nèi)存過低的時(shí)候,就會(huì)在隊(duì)列中進(jìn)行廣播,希望大家盡量釋放內(nèi)存,如果一段時(shí)間后,仍然內(nèi)存不夠,就會(huì)開始Kill進(jìn)程,直到內(nèi)存夠用。






!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多