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