【发布时间】:2010-11-23 12:33:35
【问题描述】:
有哪些技巧可以减少 .NET 应用程序的内存使用?考虑以下简单的 C# 程序。
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
}
}
在 x64 的 发布 模式下编译并在 Visual Studio 之外运行,任务管理器报告以下内容:
Working Set: 9364k
Private Working Set: 2500k
Commit Size: 17480k
如果只为x86编译会好一点:
Working Set: 5888k
Private Working Set: 1280k
Commit Size: 7012k
然后我尝试了以下程序,它的作用相同,但会在运行时初始化后尝试修剪进程大小:
class 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);
}
x86 Release 在 Visual Studio 之外的结果:
Working Set: 2300k
Private Working Set: 964k
Commit Size: 8408k
这稍微好一点,但对于这么简单的程序来说似乎还是过分了。有什么技巧可以让 C# 进程更精简一些吗?我正在编写一个大多数时间都在后台运行的程序。我已经在单独的Application Domain 中处理了任何用户界面内容,这意味着可以安全地卸载用户界面内容,但仅在后台占用 10 MB 似乎过多。
P.S. 至于我为什么会关心 ---(超级)用户往往会担心这些事情。即使它对性能几乎没有影响,半精通技术的用户(我的目标受众)也倾向于对后台应用程序的内存使用大发雷霆。甚至当我看到 Adobe Updater 占用 11 MB 内存并被 Foobar2000 的平静触感所抚慰时我也感到震惊,即使在播放时也可能占用不到 6 MB。我知道在现代操作系统中,这些东西在技术上真的没有那么重要,但这并不意味着它对感知没有影响。
【问题讨论】:
-
你为什么要关心?私人工作集相当低。如果不需要内存,现代操作系统将分页到磁盘。现在是 2009 年。除非你在嵌入式系统上构建东西,否则你不应该关心 10MB。
-
停止使用 .NET,您可以拥有小程序。要加载 .NET 框架,需要将大量大 DLL 加载到内存中。
-
内存价格呈指数下降(是的,您现在可以订购具有 24 GB RAM 的戴尔家用计算机系统)。除非您的应用程序使用 >500MB 的优化是不必要的。
-
@LeakyCode 我真的很讨厌现代程序员这样想,你应该关心你的应用程序的内存使用情况。我可以说大多数现代应用程序,主要是用 java 或 c# 编写的,在资源管理方面非常低效,多亏了 2014 年,我们可以在 win95 和 64mb 的 ram 上运行与 1998 年一样多的应用程序...现在只有 1 个浏览器实例消耗 2gb 的内存和大约 1gb 的简单 IDE。 Ram 很便宜,但这并不意味着你应该浪费它。
-
@Petr 你应该关心资源管理。程序员的时间也是一种资源。请不要过度概括浪费 10MB 到 2GB。
标签: c# .net optimization memory memory-optimization