我正在使用WPF编写一个用C#编写的小书签管理应用程序。它只是位于系统托盘中,99%的时间处于空闲状态。最近我查看了任务管理器,发现它使用了大约25兆内存(并且在第一次激活之前大约12兆),我认为这对于一个大部分时间都没有做任何事情的应用来说有点多。这让我想知道是否有任何方法可以减少内存使用量,例如,禁用可选的WPF功能。
我发现了一个可能导致某些事情的事实,尽管我不知道如何利用它。 .NET中的线程每个大约需要1兆,而事实证明我的应用程序使用大约6/12个线程(第一次激活之前和之后)。这占我的内存使用量的一半,这是非常重要的。我不直接生成任何新线程,但我不知道WPF以及.NET的其他部分如何将线程用于不同的任务,所以我发现很难对它做任何事情。使用事件来处理与GUI没有直接关系的东西,这会产生新的线程吗?
所以我想我的问题是双重的,你如何减少.NET / WPF应用程序的内存使用量,如何最小化生成的线程数?请注意,我不是在考虑诸如this answer中提到的小细节,而是考虑如何在整个应用程序中设计低内存使用率。
答案 0 :(得分:5)
不幸的是,根据我的经验,~25MB是我见过的最小的WPF应用程序,至少在Windows XP上。我认为即使是空模板WPF应用也需要大约20MB。你在运行什么操作系统?
Windows Vista是一个更好的故事,你可能希望看到一个空模板WPF应用程序大约13-15MB。
对于你的应用程序使用6-12个线程,只使用~25MB,我会说你做得很好。 : - )
答案 1 :(得分:5)
如果它是系统托盘应用程序,您可以在WinForms(甚至C ++)中实现该程序的那部分,并且只有在用户双击您的图标时才会生成WPF应用程序。这样,您只需在实际使用时支付内存。
答案 2 :(得分:1)
不确定这是否有帮助,但在MS Visual C ++中,默认堆栈大小为1 MB,可以使用编译器选项设置为您想要的任何内容。显然,C#apps继承了这个默认大小(所以每个线程至少需要1MB)。但是当我做“csc /?”时似乎没有设置它。
答案 3 :(得分:0)
CLR / JVM将allocate a larger heap memory then actually needed/used是.NET / Java应用程序的事实。他们通常不太愿意释放分配给操作系统,除非操作系统让物理内存处于零星状态。
但memory-management is a difficult topic确实如此。问题是:您如何定义应用程序的memory usage?分配的虚拟内存总量?总工作量?私人工作?在堆中使用内存?堆分配?最低,最高或平均?
您可以做的一件事是使用CLR Profiler检查是否分配了太多堆。您可以尝试通过花费内存消耗时间来优化它,以防止堆发光太多。