.NET应用程序是否内存密集?

Pio*_*trK 5 c# memory

我开始在我的生命中第一次用C#编写一个大型应用程序.我编写了示例模块来测试我的软件背后的想法.该模块包含几十个C#字典和对象列表,每个对象都有几个成员和属性.

令我震惊的是,在初始化核心对象后,它最终使用了大约40MB的RAM.

我测试并发现在对象初始化之后分配了超过30MB,但我的印象是,考虑到我的对象的大小,应该消耗不超过几百千字节.

我是否做错了什么,或者与本机代码应用程序相比,.NET自然是内存密集型的?

Fre*_*örk 12

你是如何确定使用了多少内存的?众所周知,.NET应用程序急切地保留了比他们需要的内存更多的内存,只要有足够的可用内存,并且如果内存开始不足就会将内存释放回系统.

我想你可能会在这篇MSDN文章中得到一些指导.


Bev*_*van 7

使用任务管理器来查看您的内存使用情况可能非常不准确.

相反,抓住一个适当的内存分析工具(dotTrace非常好,并有一个10天的试用期),并花时间看你的实际内存消耗.

我在自己的代码中看到的各种各样的东西包括

  • 低估了我实际使用的内存量(不正确计算单独的对象,不允许列表具有"备用"容量)
  • 保持对我不需要的瞬态对象的引用
  • 不允许在操作期间创建的尚未进行垃圾回收的临时对象
  • 不允许未分配的内存 - 已经从操作系统声明的内存(因此在任务管理器中显示为进程的一部分)但尚未分配给任何一个对象
  • 不允许线程堆栈(每个线程都有自己的堆栈; .NET应用程序总是多线程的,因为框架可能会创建自己的几个线程).


Joe*_*orn 5

在我们在一台机器上有几GB RAM的日子里,像你一样用C#构建的面向用户的应用程序应该只使用几个100K的RAM是倒退的.系统上任何未使用的ram都会被浪费掉.

考虑到这一点,C#使用与C++完全不同的策略来分配内存,这样就可以更少地分配和释放更大的块.

也就是说,40似乎有点高.对于非常简单的控制台应用程序,我已经习惯了接近10-14Mb的东西.也许有一个形式占用ram,或者我可能使用不同版本的框架(2.0).

  • "你的系统上任何未使用的ram都被浪费了." 我的应用程序没有占用的任何RAM也许可以被其他应用程序或操作系统更好地使用. (4认同)
  • 但它并没有被"哄骗",而是由运行时以贪婪的方式分配.如果需要,运行时也可以将其返回到OS. (2认同)