2008-12-23 104 views
10

我正在使用WPF編寫一個使用C#編寫的書籤管理應用程序。它只是坐在系統托盤中,並在99%的時間內處於空閒狀態。最近,我查看了任務管理器,發現它使用了大約25兆內存(並且在第一次激活之前大約有12兆),我認爲這對於大多數時間什麼都不做的應用程序來說有點多。這讓我想知道是否有任何方法來減少內存使用量,例如禁用可選的WPF功能。如何減少WPF應用程序的內存使用量

我發現了一個可能導致某些事實的事實,但我不知道有什麼方法來利用它。 .NET中的線程每個需要大約一個兆字節,事實證明,我的應用程序使用大約6/12個線程(第一次激活之前和之後)。這佔我內存使用的一半,這是相當重要的。我沒有直接產生任何新線程,但我不知道WPF以及.NET的其他部分如何使用線程執行不同的任務,所以我很難對它做任何事情。將事件用於與GUI沒有直接關係的東西,這是否會產生新的線程?

所以我想我的問題是雙重的,你怎麼能減少一般的內存使用.NET/WPF應用程序,以及如何最小化產生的線程數量?請注意,我並不是在考慮諸如this answer中提到的那些小細節,而是如何設計整個應用程序中的低內存使用率。

回答

5

不幸的是,根據我的經驗,〜25MB是我見過的最小的WPF應用程序,至少在Windows XP上是最低的。我認爲即使是空的模板WPF應用程序也需要20MB。你在運行什麼操作系統?

Windows Vista是一個更好的故事,你可能預計會看到〜13-15MB的空模板WPF應用程序。

對於你的應用程序使用6-12線程,只使用〜25MB,我會說你做得很好。 :-)

+1

我正在運行Vista 64位。說實話,這並不是我太擔心的事情。我的意思是,以當前的硬件價格,內存幾乎是免費的 - 將我的程序的每個副本與2GB內存條捆綁在一起幾乎是可行的;) – 2008-12-23 15:18:07

5

如果它是一個系統托盤應用程序,你可以在WinForms(甚至C++)中實現該程序的一部分,並且只有在用戶雙擊圖標時才生成WPF應用程序。這樣,您只需在實際使用時支付內存。

1

不知道這是否有幫助,但在MS Visual C++中,默認堆棧大小爲1 MB,可以使用編譯器選項將其設置爲任何想要的值。顯然,C#應用程序繼承了這個默認大小(所以每個線程至少需要1MB)。但是當我做「csc /?」時,似乎沒有辦法設置它。

0

這是.NET/Java應用程序的事實,CLR/JVM將allocate a larger heap memory then actually needed/used。他們通常不太願意釋放分配給操作系統,除非操作系統正在物理內存越來越少。

但的確如此,memory-management is a difficult topic。問題是:如何通過應用程序定義memory usage?總分配的虛擬內存?總工作集?私人工作組?在堆中使用內存?堆分配?最小值,峯值還是平均值?

你可以做的一件事是使用CLR Profiler來檢查是否有太多的堆分配。您可以嘗試通過消耗內存消耗時間來優化它以防止堆太多。