iOS 的內存管理和虛擬內存機制具體是怎麼運作的?

眾所周知,iOS 設備的內存普遍較小。但就最終用戶體驗而言,流暢舒服。想知道虛擬內存在其中是否發揮了作用?


謝邀。

關於 iOS 的虛擬內存,最準確的信息是看官方文檔:Memory Usage Performance Guidelines: About the Virtual Memory System。

簡單來說,OS X 和 iOS 都有虛擬內存系統,但這裡的虛擬內存和 Windows 中的虛擬內存是不一樣的。

前者是指將物理內存地址,針對每個進程,映射到不同的虛擬內存地址上。於是在一個物理並不夠大的設備上,32 位的進程也能使用 4 GB 的虛擬內存地址,64 位的進程能使用 18 EB 的虛擬內存地址。但在同一時間真正能使用內存量,仍然是設備的物理內存大小,虛擬內存並不會改變這個物理限制。它的作用就不詳述了,感興趣的可以去學計算機原理和操作系統,大概是大三的課程。

而後者指的是交換文件,即當進程使用的內存超過物理內存大小時,操作系統會將一部分暫時用不到的內存寫入磁碟的交換文件,以騰出空間;當需要用到時,又會將交換文件中所需的部分讀取到物理內存中。

OS X 是可以使用交換文件的,而 iOS 不行。

這是我在一台越獄的 iPhone 4 (iOS 6) 上執行的結果:

# sysctl vm.swapusage
vm.swapusage: total = 0.00M used = 0.00M free = 0.00M
# top
Processes: 53 total, 2 running, 51 sleeping... 303 threads
Load Avg: 0.15, 0.15, 0.17 CPU usage: 20.39% user, 0.00% sys, 79.61% idle
SharedLibs: num = 0, resident = 0 code, 0 data, 0 linkedit.
MemRegions: num = 0, resident = 0 + 0 private, 0 shared.
PhysMem: 67M wired, 53M active, 21M inactive, 414M used, 91M free.
VM: 16G + 0 384212(0) pageins, 3575(0) pageouts

第 2 行表明 iOS 6 是沒有使用交換文件的,最後一行表明目前所有進程的虛擬內存大小總量是 16 GB。

綜上可以說明,iOS 系統是不使用交換文件的,也就談不上對用戶體驗的作用。而虛擬內存只是操作系統管理內存的一種方式,也沒有什麼直接的影響(除了可以使用一些不連續的內存碎片等)。

最後我想說的是,蘋果並沒有什麼黑科技能突破物理限制,至少從開放的源碼中(Darwin)是看不出的。

iPhone 4S 相比 iPhone 4 多了一個核,所以在多線程下載時,對主線程的影響明顯小了很多。

iPhone 5 相比 iPhone 4S 多了 512 MB 物理內存,所以在 iOS 7 上就流暢了很多。

更實際的體驗是,iPhone 4 在使用 iOS 6 時,就已經很卡了,切應用時經常退出。


iOS有虛擬內存地址,但是沒有虛擬內存。內存不夠了就開始強制清退不活動的app

由於有統一的推送服務,所以絕大多數app沒有掛後台的理由,按home鍵切換走以後系統就將app完全掛起,並且根據使用頻率排優先順序,靠後的app先是被壓縮,實在不夠了就被清退


1、iOS設備普遍內存比較小是真,但是誰告訴你小內存也流暢舒服了?512MB內存的iOS設備配合iOS8已經讓人處於摔平板摔手機的邊緣了好么。重載狂魔iPad Mini2罪魁禍首也是僅有1GB的內存。

2、如其他諸位所言,iOS有虛擬內存地址,但是沒有虛擬內存沒有分頁文件。本身分頁文件性能比物理內存性能差得多,再加上性能孱弱的手機儲存,就算有的話也會非常卡頓。

3、無論是Android、iOS還是WP都沒有虛擬內存,程序只能運行在物理內存允許的範圍內。進程的內存佔用有優先順序之分,內存接近飽和之後會結束優先順序低的進程。如果前台程序內存佔用依然增加超過最大容許的大小,就會發生閃退。

4、Android與iOS和WP不同的一點是Android允許程序自己註冊服務,就是說Android後台進程會比iOS更多一些。有些後台進程有可能佔用比較多系統資源。需要注意的是,Android跟其它系統一樣也只存在一個正在運行的程序,能後台運行的是服務。

5、Android不如iOS流暢有很多原因,比如垃圾回收會造成數十毫秒的卡頓、Dalvik虛擬機、高解析度、顯卡硬體性能低,但是這不表示iOS不需要大內存。性能類似的iOS設備,大內存體驗肯定比小內存要好,參考iPad1與iPhone4迥異的命運。類似的還有WP,記得512MB內存的WP8設備單個程序只能佔用150MB內存,1GB的可以申請額外內存最大到350MB,不知道WP8.1有沒有改設定。


為什麼內存小還允許流暢,還不都是這些iOS程序員的功勞,為了螺獅裡面擺道場,他們有多努力你知道嗎。


你看看相同RAM的設備上,iOS上單個應用佔用多少內存才報警,Android的heap size才多大。。。


這問題問的。。。虛擬內存和流暢度沒關係。他僅僅是一種方便程序員的機制,不用讓程序員去關心太多硬體上的事情。分配內存和release內存的事情系統去處理。然後multi - task. iOS 4的時候,當你切換程序的時候,程序有兩個狀態,一個是Inactive, 一個是 Not Running。 Inactive 的狀態就是把程序給緩存在內存里,NotRunning 就是直接給關了,這也為啥當你開一些很久不用的App 程序會重新啟動,同理當你去看之前的網頁,會reload一下。 至於流暢度我覺得主要原因是大家主要針對一個平台的具體某幾種iPhone去開發 App自然會有很多優化,自然會流暢。


跟虛擬內存沒什麼關係。iOS和 Windows Phone都是採用墓碑機制,所以就算內存很小也能流暢運行。簡單說,就是可以理解為只存在一個正在運行的程序,其他的程序都停止運行了。so,只要單個應用所用內存小於1G或者512m,就能流暢運行。


瀉藥。ios應用是object c開發的,程序員自己管理內存,應用程序自己決定怎麼申請釋放內存。安卓應用是java開發的,虛擬機運行時自動管理內存,另外虛擬機的存在導致需要更多內存,虛擬機本身的內存回收機制導致了卡頓。簡單說,就是ios開發起來更費勁,但是性能好,安卓開發容易但是系統的內存管理不盡如人意。


虛擬內存大致可以劃分為兩類:

1.將進程佔用的內存地址映射到RAM內其他位置。

2.將進程佔用的內存地址映射到磁碟上面

ios大概是第一種 第二種應該沒有 在ios4時代虛擬內存導致了系統不穩定之後就取消了

虛擬內存其實就是一個進程的倉庫 暫時不用了丟在裡面


當前程序運行內存大了會自動關閉前面打開的程序以保證當前程序流暢運行


瀉藥,上面回答專業,數據清楚。


以下只是提出一點想法,和具體問題似乎沒有太過關係,求疊!

***

樓上說得很清楚,我想從發展的觀點說一下:

&> 可以參考一下osX的發展過程,從單窗口到多窗口

&> 從無後台服務到有後台服務

***

還有,每種iOs設備其當前應用可申請的內存數是有限的,具體數據可以參考百度上的數據,一般不超過總物理內存的三分之一。


說iOS流暢的,用4S升級過iOS 7嗎?


推薦閱讀:

iOS開發中用過的優秀三方庫?
剛買 iPad Air 2,已越獄,應該幹些什麼?
iOS 8 和 OS X Yosemite 的 Continuity / Handoff 特性有何使用場景?
iOS 8.3 越獄後兼容哪些插件?
iOS 8 正式版體驗如何?

TAG:iOS | iOS7 | 虛擬內存 | iOS8 |