【e800編譯】在這篇文章裡,筆者從宏觀的角度進行闡述,這樣你就能瞭解使用指導背後的原因,並在Windows Phone記憶體管理方法演化的同時確保應用能正常使用。下面是參考表格:
版本 |
裝置 |
最小容量 |
最大容量 |
分頁 |
WP OS 7.1 |
所有 |
90M |
可變 |
無 |
WP SDK 7.1.1更新 |
256MB |
90M |
110M |
從55M開始 |
WP SDK 7.1.1更新 |
大於等於512MB |
90M |
可變 |
無 |
曆史
WP OS 7.0和7.1, 應用僅限於90M記憶體。不過應該或許可以使用的容量會超過90M。90M是最小值。至於最大值,有些程式員認為WP應用沒有記憶體限制,可用記憶體大於90M。事實上,應用經常會問鼎——因為極值不是恒定的。應用可消耗的記憶體可以一直處於90M以上,而且從某種程度上說,分配可能會失敗。對於一個受託管的應用而言,是通過一個OutOfMemoryException(OOM)在表面實現。
觸發OutOfMemoryException又對其進行處理的應用就會終結。確切地說,應用何時達到這個可變值的頂部取決於系統內部的運行情況。手機裡面的資源管理員組件管理著應用記憶體,但並不能管理OS本身,因此可供應用使用的記憶體量是變化的:一般最少是90M,有時會更多,有時則不會。這種可用量的不可預見性很難應付。我們在現有WP Store目錄上的資料顯示大部分應用都不會在90M之內。這就是說,有些應用會超出90M。
WP7.1.1發布後,應用記憶體頂峰值會更有意思。90M是唯一的保證。而WP7.1.1的分頁也很有意思。現在,OS通常都可以分頁,但是它此前並不在手機中。因為分頁比較耗時,會影響UX,最終還可能降低快閃記憶體的作用。
分頁是台式機和伺服器電腦中很普遍,但是在行動裝置中不常見。分頁可以讓系統分配更多記憶體。它是通過使用快閃記憶體分頁檔來實現。在WP 7.1.1上,應用可以分配到110M的虛擬記憶體。如果應用只使用50到60M記憶體,那麼所使用的記憶體都是實體記憶體。如果應用的記憶體消耗超過了所分配的值,那麼可在分頁檔中獲得額外的虛擬記憶體。應用執行過程中,分頁檔以外的代碼和資料會根據需要分頁或移出分頁。
移入移出分頁很耗時間,而且頁面寫入會導致快閃記憶體裝置的磨損。過量的頁面寫入最終會導致快閃記憶體損耗。裝置的整體效能降級,應用的OOM會加劇。7.1.1中的一個挑戰在於指出最佳分頁值,這樣我們就不會在裝置的預計生命週期中出現快閃記憶體效能降低。
7.1.1中引入分頁的目的是滿足低記憶體裝置的需要。全球對能滿足最低使用需要且可用記憶體低的手機的需求很大。即便沒有詳細瞭解詳細資料,你也可以做下簡單計算:
實體記憶體總量 |
|
256 |
Modem |
30 |
|
映像 |
40 |
|
OS |
50 |
|
裝置驅動,系統範圍,頁面池,系統緩衝等 |
40 |
|
背景音頻,各種緩衝 |
40 |
|
合計 |
200 |
|
剩餘記憶體 |
|
56 |
如果在WP OS 7.1記憶體模式下所有程式員都堅守指導不超過90M,在
沒有分頁的情況下,大部分現有應用在256M裝置上運行時都會出現過多的OOM。注意這是基於應用使用圖表,其中大部分應用都適合55M的實體記憶體,而且90%以上的都適合90M。此外,即便應用出現消耗90M的情況,也不會一直停留在此狀態。這就是說,大多數時候應用沒有分頁。分頁值讓我們可以保留對現有WP Store目錄的支援,與此同時還可以產生可預計的,平衡的整體UX。
7.1.1分頁模式允許應用記憶體佔用量達到110M,但是可用量是固定的。在256M裝置上,超過110M通常會出現OOM。運行於高記憶體裝置的相同應用或許可以超過110M,儘管現在這一點並沒有保障。
從大的角度來說,這意味著現有目錄的大量應用可以在所有已知裝置上順利使用。最重要的是,應用在大於256M記憶體的裝置上使用效果更佳,因為應用或許大多數情況下回有更多可用記憶體,而不局限於110M。
程式員的選擇
現在,你知道WP OS7.x 的記憶體管理的合理量,那麼你能做的是什麼呢?有兩個選擇:
第一個選擇是讓應用適應90M,這樣它就可以在所有裝置上使用。有很多支援平台API的技術可供你調整應用。當然,你可以使用Visual Studio 緩衝分析器來監控應用運行時的效能。如果你不適合90M,但是適合110M,那就可以在所有裝置上使用。只是你的UX可能會因為分頁而不能在256M裝置上運行良好。API賦予了你足量的工具來調整應用,或許可以通過有條件地在有較高記憶體的裝置上啟用子集的功能來調節。
如果在調節和有條件禁用某些效能後仍無法適應110M,還可以換另一個選擇。首先,編輯應用找到導致記憶體消耗大於110M的代碼路徑。如果使用者只是偶爾出現這一問題,那還處於可接受範圍。如果經常發生,就要從較低記憶體裝置給應用降級。記住:低記憶體裝置尤為重要。如果你不能應用是否可用於低記憶體裝置,就要將其清理出智能手機應用市場。
關於未來
分頁是用來支援裝置上的最大應用量。其代價是稍稍削弱效能。但即便如此,使用者還是難以察覺的。
那麼此後的策略應該是什麼呢?在WP 8中,OS不再是Windows CE,取而代之的是共用Windows 8的常用程式碼程式庫。當然Window 8會使用分頁。這是否意味著我們將在WP 8中使用分頁呢?此策略從7x之後就沒有改變過:OS可以分頁,我們也願意使用分頁。目的只是支援所有裝置上的應用,而不會對UX產生無法預料的副作用。
如你最近能從諾基亞和HTC要推出的新型WP8 手機,包括720p(1280*720)或WXGA(1280*768)的廣告中看到的。如果你想一想,就會發現更高的解析度需要消耗更多記憶體。7x僅支援WVGA(800*480),如果你升級7x系統的應用來擷取更高解析度的映像,現有的映像也可以擴充。現有的7x應用將在WP8上佔用更多記憶體。此刻,雖然無法對WP8上應用的運行細節進行預測,但是由於對於7x過度到WP 8的思考已有時日,所以不用太擔心。
原文連結:http://blogs.windows.com/windows_phone/b/wpdev/archive/2012/10/08/the-evolution-of-windows-phone-memory-management.aspx