4

我正在支持WM6平臺上的「舊」移動應用程序。我們最近不得不升級到新設備,因爲舊設備不再可用。這也意味着從WM6.1升級到WM6.5,以及從.NET CF 2.0升級到3.5。Windows Mobile:如何識別和阻止共享DLL佔用地址空間?

這個應用程序的主要問題是持續的內存壓力(OutOfMemoryExceptions)。我曾嘗試修復內存泄漏,並優化了某些內存消耗代碼。但是,在新設備上,整個情況比老年人差得多。我知道每個進程都有32MB的虛擬內存限制,不管有多少物理內存可用(interesting read)。

我用VirtualMemory.exe和摩托羅拉eMScript來可視化/分析我的應用程序的32MB內存插槽。這是進程虛擬內存的樣子(總共32MB,每個灰色條代表1MB,頂部是新設備,底部是舊設備)。紅色條右側的所有內容都是第三方DLL(OS,Vendor,...)。通過切換到新設備,我們又損失了3MB。

virtual memory map

看來,應用正在遭受「DLL緊縮」的問題,一些第三方的DLL佔據了右邊(最高地址)的虛擬內存地址。注意:左邊的藍色條被.exe佔據,我可以使用this awesome trick來消除它。

所以這裏是我的問題:我如何確定哪些DLL佔用了我的地址空間?我嘗試了eMScript,它給出了所有DLL和地址列表,但不是紅色欄右側的那些(共享DLL)。 是否有任何一般的建議或提示如何減少這種數量的地址空間丟失?有人推薦使用「減少圖形驅動程序」,但我不相信這將解決正確的問題。

新設備是摩托羅拉MC65,以防萬一。

回答

0

改善對.NET CF應用程序的內存,你可以實現的伎倆文章MemMaker for the .NET Compact Framework中解釋說: 移動所有的託管代碼從EXE到DLL的。這可以幫助您在32MB插槽中釋放一些內存。

其他相關條款爲獵殺虛擬內存怪物

0

偉大的問題和信息。看我的>筆記。

「...我如何識別哪些DLL佔用了我的地址空間?我嘗試了eMScript,它給出了所有DLL和地址列表,但不是紅色條右側的那些(共享DLL)。 「

試着找到devhealth的副本。這是一個MS工具來列出所有的DLL和地址和引用。另請參閱http://www.hjgode.de/wp/2009/05/27/managed-application-suddenly-fails-to-invoke-dlls/

「有沒有關於如何減少這些丟失的地址空間的一般性建議或提示?」

其中一些DLL由驅動程序和後臺進程加載。您可以通過禁用一個或其他應用程序的啓動來「消除」其中的一些。但我最擔心的是設備/操作系統需要它們。一般來說,WM653設備的內存情況應該比WM61好。 MS增加了一些額外的「內存儲存器」。但是新的操作系統也帶有新的功能和服務,所以'內存增強'的可能性比較小。 如果你不能刪除驅動程序/應用程序,你應該將你的單個應用程序分成幾個進程。例如,如果您使用攝像頭拍攝照片功能,然後將其分割爲單獨的應用程序,它將獲得它自己的32MB處理插槽。

+0

OK,我發現DevHealth '在網絡上的某個地方' ......不過,我不能」找到查看器,並且在沒有它的情況下解釋巨大的ASCII文件是不可能的。我讀過它包含在Windows Mobile Adaptation Kit中,但您需要與Microsoft達成OEM協議。 – DavWEB

+0

請嘗試hxxp://en.pudn.com/dl.asp?id = 2329891 – josef

相關問題