來(lái)點(diǎn)漲姿勢(shì)的吧。
現(xiàn)在電視市場(chǎng)的新品非常非常少,就算是發(fā)布新品也圍繞著處理器核心和屏幕分辨率進(jìn)行的。
而手機(jī)市場(chǎng)上卻又辣么辣么多的新品發(fā)布,動(dòng)不動(dòng)就是2K屏幕、8核心及3G內(nèi)存。
說(shuō)到內(nèi)存,各位使用過(guò)安卓設(shè)備的朋友一定希望安卓系統(tǒng)的內(nèi)存越大越好。但反觀來(lái)看,蘋(píng)果的設(shè)備內(nèi)存卻一直為此在1GB呢?(新出的ipad air2為2GB內(nèi)存,但是可以暫時(shí)不提。)
其實(shí)這是安卓系統(tǒng)及ios系統(tǒng)內(nèi)存回收機(jī)制的區(qū)別。
所以,本篇就來(lái)點(diǎn)漲姿勢(shì)的內(nèi)容吧:內(nèi)存回收機(jī)制哪家強(qiáng)?android及ios內(nèi)存回收機(jī)制優(yōu)劣對(duì)比。
其實(shí)探討到內(nèi)存回收機(jī)制,不得不得到雙方的開(kāi)發(fā)平臺(tái):java和Objective-C。
Java
Java里內(nèi)存的回收是由JVM虛擬機(jī)控制的,回收時(shí)間及回收量完全是由JVM決定。優(yōu)勢(shì)是攻城獅完全不用操心內(nèi)存泄露的問(wèn)題和非法訪問(wèn)。
簡(jiǎn)而言之是Android所有可用的內(nèi)存僅限于系統(tǒng) RAM,當(dāng) Android 應(yīng)用程序退出時(shí),并不清理其所占用的內(nèi)存,Linux 內(nèi)核進(jìn)程也相應(yīng)的繼續(xù)存在,所謂“退出但不關(guān)閉”。從而使得用戶調(diào)用程序時(shí)能夠在第一時(shí)間得到響應(yīng)。當(dāng)系統(tǒng)內(nèi)存不足時(shí),系統(tǒng)將激活內(nèi)存回收過(guò)程。為了不因內(nèi)存回收影響用戶體驗(yàn)(如殺死當(dāng)前的活動(dòng)進(jìn)程)。
回收過(guò)程就是GC,具體可以描述為:
150745d1y6yqxg1qxz2r7x.png.thumb.jpg (47.22 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
2015-2-18 00:15 上傳
內(nèi)存回收的線程:主線程變成→低線程;單線程變成→多線程
內(nèi)存回收時(shí)機(jī):App空閑時(shí)、可用內(nèi)存少時(shí)、分配大內(nèi)存空間不夠時(shí)
內(nèi)存回收方式:無(wú)分代技術(shù),一次性GC所有對(duì)象;分代技術(shù),分為年輕、老年代、持久代。
Objective-C
Objective-C的內(nèi)存回收方式是引用計(jì)數(shù)的內(nèi)存回收方式。凡是繼承NSObject的類生成的對(duì)象,當(dāng)對(duì)象的計(jì)數(shù)為0,會(huì)對(duì)對(duì)象執(zhí)行dealloc并回收。引用計(jì)數(shù)有個(gè)缺點(diǎn),無(wú)法解開(kāi)循環(huán)引用。設(shè)想對(duì)象A引用B, B引用A,兩個(gè)對(duì)象計(jì)數(shù)都不為零,結(jié)果無(wú)法回收A和B,于是內(nèi)存泄漏掉了。
這也是為什么樓主認(rèn)識(shí)的一些攻城獅經(jīng)常吐槽給ios開(kāi)發(fā)程序很麻煩的原因,但是很鍛煉技術(shù)。
150740yys22o8kycxkvskd.jpg.thumb.jpg (4.03 KB, 下載次數(shù): 10)
下載附件
保存到相冊(cè)
2015-2-18 00:15 上傳
對(duì)比Java的情況:
151201pb1elnbke0lnpk9z.jpg.thumb.jpg (11.97 KB, 下載次數(shù): 15)
下載附件
保存到相冊(cè)
2015-2-18 00:15 上傳
151201dp57z59nd7t5z31d.jpg.thumb.jpg (11.03 KB, 下載次數(shù): 14)
下載附件
保存到相冊(cè)
2015-2-18 00:15 上傳
Java用樹(shù)描繪了對(duì)象間的引用關(guān)系。GC的任務(wù)就是把圖中沒(méi)有任何引用的對(duì)象B們找出來(lái),刪掉。什么算法?似乎跟不同的實(shí)現(xiàn)有關(guān),我也沒(méi)深入研究。JVM依賴樹(shù)的結(jié)構(gòu)來(lái)尋找垃圾,而Objective-C則只關(guān)心引用計(jì)數(shù),“樹(shù)”只是個(gè)附產(chǎn)品。
好了。 廢話了這么多,能到關(guān)鍵內(nèi)容了么?
嗯~
Java:
優(yōu)點(diǎn):
攻城獅不需要關(guān)心循環(huán)引用導(dǎo)致的內(nèi)存泄露,減輕了負(fù)擔(dān)
缺點(diǎn):
1. 很難控制內(nèi)存的釋放時(shí)機(jī)
2. 所有線程都要暫停以便GC。GC時(shí)間可能會(huì)很長(zhǎng),導(dǎo)致系統(tǒng)會(huì)很長(zhǎng)
Objective-C:
優(yōu)點(diǎn):
內(nèi)存釋放及時(shí)、平滑,時(shí)機(jī)可控
缺點(diǎn):
不小心就寫(xiě)出內(nèi)存泄漏,要時(shí)刻保持清晰的對(duì)象間聯(lián)系 |