http://topic.csdn.net/u/20110412/17/6cd84fbc-7582-4ef5-8b1b-21599ddd69ff.html?seed=823753982&r=72741303#r_72741303原帖结贴早了,以致不能给之后的有效回复积分,特开此贴。qldsrx(青龙白虎)请进。

解决方案 »

  1.   

    对了,还有一个问题,我测试的时候开一千万的数组执行10次,执行完毕之后不到10s就释放本部分资源了。但是开一百万的数组执行100次则至少在二十分钟内这部分内存是不释放的,我没时间等更长的时间,但是应当在一定的时间之后会释放的。GC自动释放内存的时机跟什么有关?如果我在M1的第一行让线程休眠一秒,则每次申请的资源立马便释放了。也就是说线程的活动会触发GC的动作。其他的呢?执行一百遍的方法怎么就比执行十遍的要晚回收这么长的时间?
      

  2.   

    其实就是GC在管理那些对象占用的内存,会自动利用已经没有引用的对象的内存,以至那些内存不释放到系统,还是给程序占着,这样下次用到内存的时候就不用向系统再次申请了。
    虽然这样的管理挺好的,但是也不要给一个程序占太多内存,不然别人会觉得你程序有问题,怎么霸占那么多内存啊。尽可能自己程序内部重利用内存,比如申请一个很大的内存空间时,尽量只申请一次,使用100次,而不是100次每次都申请,如果你那个申请空间(NEW操作)在循环(或递归)外部就做好了,内部仅仅是修改其值,做相关操作,程序里就做好了重利用内存,那么你第一种递归写法也是没问题的。
      

  3.   

    每次递归都执行前面那个百万次的循环,要分配百万次,一次int 2字节,2*10 000 000*100个字节吧。内存肯定都不够!!
      

  4.   


    不敢苟同,就原帖的例子,调试状态下打开Debug->Windows->Memory窗口,你可以调试看一下,每次的分配
    arr都是在不同的内存地址开辟的.
      

  5.   

    你难道不知道.NET的内存地址的吗?除非你用GCHandle将某个对象的地址固定下来,否则你是永远看不准那个虚拟的内存地址的——你那个调试器里显示的地址是虚拟地址,每个32位应用程序都有4G虚拟地址,但是实际的物理内存地址应该是重利用的,所以说是GC在自动管理,你无法干预。
      

  6.   

    纠正:.NET的内存地址是动态的
      

  7.   

    请问你是调试的哪个例子?为了证实你所说的情况,我特意去打开Debug->Windows->Memory窗口,结果里面什么都看不到,“Unable to evaluate the expression. ”。你又是怎么看那个内存地址的?希望不是信口开河才好。