2008-12-23 121 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来检查是否有太多的堆分配。您可以尝试通过消耗内存消耗时间来优化它以防止堆太多。

相关问题