日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 jlland 2016-03-07

author:Martin_wjl

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


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

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

當(dāng)然具有分類(lèi)

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

  • Dirty Memory:所有非Clean Memory,系統(tǒng)無(wú)法回收。包括Heap allocationcaches、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)存中。來(lá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)存。后來(lái)for循環(huán)中,我們進(jìn)行讀寫(xiě),操作系統(tǒng)就會(huì)分配3兆的物理內(nèi)存,而其他97兆是在虛擬內(nèi)存。

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

使用Allocations工具來(lái)驗(yàn)證剛才的說(shuō)法

下面這個(gè)圖片,剛才已經(jīng)分析過(guò)了,對(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ù)。

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


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

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


點(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è)概念,我們的程序訪問(wèn)的都是邏輯地址空間(也叫虛擬地址),邏輯地址需要經(jīng)過(guò)轉(zhuǎn)換之后才可以訪問(wèn)到物理內(nèi)存。虛擬內(nèi)存到物理內(nèi)存的映射是怎樣的呢?

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


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

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


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

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

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


從上往下,優(yōu)先級(jí)越來(lái)越高,看圖可以發(fā)現(xiàn),優(yōu)先級(jí)由低到高是:IDLE(空閑)->BACKGROUND->FOREGROUND,依次類(lèi)推。當(dāng)內(nèi)存過(guò)低的時(shí)候,就會(huì)在隊(duì)列中進(jìn)行廣播,希望大家盡量釋放內(nèi)存,如果一段時(shí)間后,仍然內(nèi)存不夠,就會(huì)開(kāi)始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)買(mǎi)等信息,謹(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)論公約

    類(lèi)似文章 更多