大哥大姐们,小弟没分呀。有高人知道不。。

解决方案 »

  1.   

    但是有个老师说,do while调用的是虚方法,并不会增加内存实际内存还是增加,求大大给个例子,好让我分析分析
      

  2.   

    占用内存的跟do while蛋关系都没有...只跟你do while里那些垃圾代码有关系...难道因为你在操场跑圈越来越累,你就说圆圈会导致人累吗?
      

  3.   

    你们看以下代码:public Collect<UseCaseScenarioBase > SelectedUseCaseScenarios=new Collect<UseCaseScenarioBase >();以下是对集合
    do
    {foreach (UseCaseScenarioBase useCase in this.SelectedUseCaseScenarios)
    {do
    { //对SelectedUseCaseScenarios集合的操作,操作完后,GC.collect....}while (useCaseExceptionThrown && this.ScenarioRetryCount-- > 0);}}while (--this.scenarioRepeatCount > 0);scenarioRepeatCount 表示循环次数。
    每次进do操作之前,都会对集合SelectedUseCaseScenarios赋值,然后循环跑do内部,直到scenarioRepeatCount为0,然后问题出来了,就是每当循环完一遍,scenarioRepeatCount--,继续跑的时候,内存都会在原先的基础上增加.这正常不。
      

  4.   


    操作对象的集合是在循环之前赋值的,循环过程中没有任何赋值,如果强制=null,循环就failed
      

  5.   

    是的...另外.NET托管资源释放还有个前提条件就是GC认为托管堆应该清理了,至于GC什么时候这样认为是未知数...更重要的是,不恰当地调用GC.Collect很可能适得其反,扰乱GC的工作...
      

  6.   


    我大概知道了,是这样的,在对集合的操作过程中,我都用log记录每一步的操作,也就是说循环10遍,log都会记录,这就是集合里面托管资源没被释放的真正原因吗?=。=
      

  7.   

    谢谢大螃蟹,我大概知道了,在对集合的操作中,我都用log记录每一步操作信息,循环10遍就记录10遍,难道就是因为这个原因导致内存无限增吗-。-
      

  8.   

    楼主没有把问题细化。我猜楼主的意思是:在do ... while前的一所用到的一些数据,到do ... while 结束后什么时候,释放的。这个要看你的数据,是值还是引用类型的,是局部还是全局的参数数据。都会影响你所提问的你这结果。把情况说细一点就好。另外,GC是双连表来判断是否回收的。不要滥用GC强制回收就好。
      

  9.   

    感谢18楼的回复,的确这个我用来记录操作信息的log是全局静态变量(引用类型)。
    几乎所有的操作都会用到log来记录,并且跑一万遍记录一万遍=。=。这个合理吗,但是内存却hold不住啊,如果跑一万遍。
      

  10.   

    感谢17楼回复,这个应该有关系的吧,如果不用log来记录操作信息,也就不会引用集合里面的东西,也就不会无法释放,不是吗
      

  11.   


    LZ我明白你的意思了
    do while在执行的适合系统会分配一块儿资源一直到循环完成退出来才施放资源
    具体怎么分配 怎么施放不是很清楚 等楼下高人来解答
      

  12.   

    是的,循环结束,循环内创建的对象肯定会被释放掉的,现在的问题就是循环过程中,内存慢慢的增加,增加的原因我想我找到了,就是log把操作集合给拖住了,因为我需要log记录每一个操作信息。
      

  13.   

    如果while不出去,内存就会占着。
      

  14.   

    如果你不申请内存,内存怎么会增加,while不过是占着CPU时间而已如果申请了,及时释放即可
      

  15.   

    你那个log是写文件操作?还是?
      

  16.   

    对的,写文件的操作,返回的string 写入 txt文本文件里,这个文本文件是一直在增加的,直到循环跑完。
      

  17.   

    写个代码段来大概描述你的问题吧。结构要与你在do ... while的结构一样。否则帮不了你。log写文件的话,是怎么写,对Stream对象的创建,写,写结束,Close,Dispose,没有一个完整的过程?
      

  18.   

    static void Main(string[] args)
            {
                int i = 100000000;
                int[,] k = {
                           {1,2,3},
                           {4,5,6},
                           {7,8,9},
                           };
                do
                {
                    foreach (int b in k)
                    {
                        bool isPass = true;                    do
                        {
                            System.Console.WriteLine(b);
                        } while (isPass == false);
                    }
                } while (--i > 0);
            }我写了个类似的,你看看
      

  19.   


            static void Main(string[] args)
            {
                int i = 100000000;
                int[,] k = {
                      {1,2,3},
                      {4,5,6},
                      {7,8,9},
                      };
                do
                {
                    Method(k);
                } while (--i > 0);
            }        private void Method(int[,] k)
            {
                foreach (int b in k)
                {
                    bool isPass = true;                do
                    {
                        System.Console.WriteLine(b);
                    } while (isPass == false);
                }
            }