有什么技巧可以減少.NET應用程序的內存使用?考慮以下簡單的C#程序。class Program{ static void Main(string[] args) { Console.ReadLine(); }}在x64的發(fā)布模式下編譯并在Visual Studio外部運行,任務管理器報告以下內容:Working Set: 9364kPrivate Working Set: 2500kCommit Size: 17480k如果只為x86編譯會更好一些:Working Set: 5888kPrivate Working Set: 1280kCommit Size: 7012k然后,我嘗試了以下程序,該程序執(zhí)行相同的操作,但嘗試在運行時初始化后減小進程大?。篶lass Program{ static void Main(string[] args) { minimizeMemory(); Console.ReadLine(); } private static void minimizeMemory() { GC.Collect(GC.MaxGeneration); GC.WaitForPendingFinalizers(); SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, (UIntPtr) 0xFFFFFFFF, (UIntPtr)0xFFFFFFFF); } [DllImport("kernel32.dll")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool SetProcessWorkingSetSize(IntPtr process, UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize);}在Visual Studio外部發(fā)布的x86 上的結果:Working Set: 2300kPrivate Working Set: 964kCommit Size: 8408k這樣做更好一些,但是對于這樣一個簡單的程序來說似乎仍然過多。有什么技巧可以使C#流程更精簡嗎?我正在編寫一個旨在大多數時候在后臺運行的程序。我已經在單獨的“ 應用程序域”中進行了任何用戶界面操作,這意味著可以安全地卸載用戶界面操作,但是僅在后臺使用時要占用10 MB的空間。PS關于我為什么要關心---(高級)用戶傾向于擔心這些事情。即使對性能幾乎沒有影響,精通半技術的用戶(我的目標受眾)也傾向于對后臺應用程序的內存使用情況感到不滿。甚至當我看到Adobe Updater占用11 MB的內存并因Foobar2000的平穩(wěn)觸摸而感到安慰時,即使我在播放時,它也占用不到6 MB的內存,我也感到非常驚訝。我知道在現代操作系統(tǒng)中,這些東西實際上在技術上并沒有多大關系,但這并不意味著它對感知沒有影響。
3 回答

鳳凰求蠱
TA貢獻1825條經驗 獲得超4個贊
與本地應用程序相比,.NET應用程序將具有更大的占用空間,因為它們都必須在運行時中加載運行時和應用程序。如果您想要真正整潔的東西,.NET可能不是最佳選擇。
但是,請記住,如果您的應用程序大部分時間處于睡眠狀態(tài),則必要的內存頁面將被換出內存,因此在大多數情況下,實際上并不會給系統(tǒng)造成太大的負擔。
如果要減小占用空間,則必須考慮內存使用情況。這里有一些想法:
減少對象的數量,并確保不要將任何實例保留的時間都超過所需的時間。
請注意,
List<T>
類似類型的設備在需要時會使容量增加一倍,因為它們可能導致多達50%的浪費。您可以考慮使用值類型而不是引用類型,以在堆棧上強制使用更多內存,但是請記住,默認堆??臻g僅為1 MB。
避免使用超過85000字節(jié)的對象,因為它們將進入未壓縮的LOH,因此很容易碎片化。
無論如何,這可能不是一個詳盡的清單,而只是幾個想法。

LEATH
TA貢獻1936條經驗 獲得超7個贊
在這種情況下,您需要考慮的一件事是CLR的內存成本。為每個.Net進程加載CLR,因此會考慮內存因素。對于這樣的簡單/小型程序,CLR的成本將決定您的內存占用量。
與該基準程序的成本相比,構建一個實際的應用程序并查看其成本將更具啟發(fā)性。
- 3 回答
- 0 關注
- 722 瀏覽
添加回答
舉報
0/150
提交
取消