直接创建windows窗口程序,编译执行,进程管理中看到内存占用量达到8M之多,form1中只有一个按钮再创建一个form2,也添加一个按钮,其click事件代码:
private void button1_Click(object sender, EventArgs e)
        {
            this.Dispose(true);
        }form2被ShowDialog()的时候占用内存达到9M以上,点击其按钮关闭form2,内存占用量增至10M,等待5分钟依旧不变。
用工具软件查看,调用了N多DLL文件。最小化之后占用内存500K~600K,然后在最大化变成3M。可见创建之初占用内存是很夸张的,是我不希望的。而程序在操作过程中最小占用量3M也是我不希望的(毕竟这个测试程序小的可怜)。MFC建立一个有菜单栏的普通项目也就几百KB的内存占用量。
如上的问题有解决方案吗?

解决方案 »

  1.   

     这是由.Net Framkework的垃圾回收机制决定的,它不会时时去执行内存回收,
     而是自动计算一个回收的最佳时间来进行内存回收,就像你所说,如这时你机器上的可用内存很大,那么,垃圾回收机制可认为现在不必进行内存回收。
     强制垃圾回收可以使用GC.Collect()。
     下面MSDN上的说法: 您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。有关更多信息,请参见 GC.Collect 方法。在垃圾回收器执行回收之前,它会挂起当前正在执行的所有线程。如果不必要地多次调用 GC.Collect,这可能会造成性能问题。您还应该注意不要将调用 GC.Collect 的代码放置在程序中用户可以经常调用的点上。这可能会削弱垃圾回收器中优化引擎的作用,而垃圾回收器可以确定运行垃圾回收的最佳时间。
      

  2.   

    有没有办法用程序控制 Framkework的垃圾回收机制  
      

  3.   

    它初始化的运行环境就这么大
    经过我常年的使用,感觉net环境比纯c++在win环境下,内存占用多50%,速度慢一倍,这还是比较能够接受的,但是如果编码不够好,那还比c++更慢
      

  4.   

    慢是肯定的,因为中间多了一层...GC是没办法控制的..看一下CLR第二版就明白了!