2012-08-22 91 views
1

我的任務是減少Windows CE 5.0應用程序的內存佔用。我遇到Rob Tiffany's highly cited article,它建議使用受管DLL來將代碼保留在進程的插槽之外。但有一些我不明白。託管代碼的大小如何影響內存佔用量?

文章說,

JIT編譯器在你的插槽運行,它IL拉從1 GB空間,需要編譯當前調用堆棧。

這意味着受管DLL中的所有代碼可能最終都會在進程的槽中結束。雖然這將有助於其他進程通過不加載公共區域的代碼如何幫助這個過程? FWIW文章也提到

這也減少了有你的

我唯一的想法內部分配的內存量,只是作爲代碼被拉入插槽它也推/換出。但這只是一個瘋狂的猜測,可能完全是假的。

回答

0

CF程序集不會像原生DLL那樣加載到進程槽中。它們實際上是作爲內存映射文件訪問的。這意味着DLL的大小實際上是不相關的。

託管堆也位於共享內存中,而不是您的進程插槽,因此對象分配不太可能導致進程插槽碎片或OOM。

該JITter也不只是JIT和永遠舉行。它彙編了什麼是必要的,並且在GC期間可能會很好地匹配沒有被使用的編譯代碼,或者在一段時間內沒有被使用過。你永遠不會看到整個程序集JITTed並將其拉入緩慢的過程(好吧,如果它可能是一個小程序集,但它肯定不是典型的)。

很顯然,一些進程槽存儲器必須用於創建一些指針,堆棧存儲等,但總體來說,託管代碼對進程槽的限制比本地代碼少。當然,你仍然可以通過大堆棧,P/Invokes,原生分配等達到極限。

以我的經驗,人們最常遇到的問題是CF應用程序和GDI對象和繪圖。位圖佔用大量內存。儘管它主要在共享內存中,但創建大量內容(以及畫筆,筆等)而不緩存和重用是最常見的大型託管應用程序內存佔用情況。

想了解更多細節this MSDN webcast on Compact Framework Memory Management,雖然舊,但仍然非常相關。

+0

謝謝你的詳細回覆。 –