C#GUI使用了很多ram?

时间:2009-05-28 00:34:42

标签: c# performance

我很好奇,这不是问题。通常我的(C ++)应用程序使用非常少的内存。我认为我当前的应用程序将占用很少的内存,但它使用3.7mb和VM大小17.3mb。该应用程序在其资源文件中有4个图标,在本地(用户)设置中有4个整数,并且应用程序LoC是<1k。它检测keyinput并在用户空闲时将一行写入列表框(调用windows函数)。它将自身置于系统托盘中,并将计时器设置为100毫秒。

没有数组或任何存储,除了一些少于256字节的结构。为什么我的应用程序使用17mb + VM?

6 个答案:

答案 0 :(得分:10)

因为它是托管应用程序,所以CLR的一部分也将加载到内存中。此外,CLR将分配一堆内存,以便它可以满足新的对象请求(它不会从系统中分配每个对象)。还有一堆其他对象可以在托管模型中为每个应用程序分配(例如线程池,垃圾收集器等)。

我不确定你能做些什么来减少它,但另一方面,你不会看到它与应用程序的复杂性呈线性关系(如果你的复杂性增加一倍,就不会使用它两倍的记忆)。

答案 1 :(得分:4)

对于一个简单的C#应用​​来说,17 megs听起来很合适。

我猜这是常年的“硬件使用与程序员生产力”的争论。

答案 2 :(得分:4)

如果你想知道究竟是什么占据了那段记忆,那就抓住.NET memory profiler

答案 3 :(得分:3)

使用.NET框架编写的程序本身就有更多的开销。

答案 4 :(得分:2)

需要记住的是,每个托管线程也有1MB堆栈。如果你正在使用线程做任何事情,那就是马上的几个MB。

答案 5 :(得分:2)

不要担心Hello World应用程序的内存消耗。

托管语言应用程序处理其内存使用情况的方式不同于C语言,其中每个内存分配都有可能无法解除分配。 在某些情况下,如果应用程序在malloc / dealloc中花费大量时间,.NET应用程序甚至可能比用C ++编写的等效应用程序运行得更快,因为CLR可以在应用程序空闲之前推迟解除分配/垃圾收集。