c#内存溢出异常 “System.OutOfMemoryException”类型的错误


   private void button1_Click(object sender, EventArgs e)
        {
            var count = 0;
            var smallBlocks = new List<byte[]>();
            var smallBlockSize = 90000 ;
            var largeBlockSize = 1 << 24;
            for (int i = 0; i < 5000; i++)
            {
                var bt = new byte[90000];
                smallBlocks.Add(bt); 
            }
            while (true)
            {
                
                var bigBlock = new byte[0];
                text tx = new text();
                tx.tx(smallBlockSize, largeBlockSize, smallBlocks, bigBlock, count);
                largeBlockSize++;
                smallBlockSize++;
                count++;
            }
        }
    }
    public class text
    {
        public void tx(int smallBlockSize, long largeBlockSize, List<byte[]> smallBlocks, byte[] bigBlock,int count)
        {
            try
            {
                bigBlock = new byte[largeBlockSize];
                smallBlocks[(count % 5000)] = new byte[smallBlockSize];
                GC.Collect();
            }
            catch 
            { }
        }
    }
我按照我的程序和网上查的资料做了下测试,以上的代码在我的机子上运行了213077次循环出现System.OutOfMemoryException的报错,出现报错时内存仍显示有3.6个g可用,现在的问题是我不修改数组的大小,或者说把数组拆分会变得非常麻烦.

你用自己特意设计的操作步骤立刻重现bug。不是让你坐在那里干等着bug它自己出现。

这是一个态度问题,想明白、接受这个,你才能开始调试代码问题。

将来你测试比较多了,就会明白测试跟调试的本质区别了。

测试的人是强者、他设计测试用例,他知道bug越早调出来越好。而仅仅调试的人是弱者,他祈求上苍别让bug出现。

你自己要先用心观察,然后几乎 80% 以上的概率保证你“操作几步就能把 bug 重现出来”。有个这个过程,再贴调试信息。

如果你干等着 bug,那顶多就是一个产品售后维护人员(而且是只做手工录入操作的维护人员),而不是一个开发人员。

x86 x64?报错时内存用了多少?64位系统,报错时内存用了4.3g

我这新手都看出问题了你5000*90000要多大啊,另外你每个循环都是用gc.collect没效果还占资源,最大的问题就是gc.collect调 用太多次,把这句删除,估计就恢复正常。全程没有对象close clear,你的这个gc是虾忙。你自己小蜜蜂论坛回帖机跑10000次gc.collect也会卡死

这个gc不是清除当前类的垃圾,而且清除上一次运行这个类产生的垃圾的。。。。而且大的不是5000*90000,大的是1<<24,出问题的原因不是没内存了,而是有内存但是没法放进去。

发布了74 篇原创文章 · 获赞 0 · 访问量 3098

猜你喜欢

转载自blog.csdn.net/netyou/article/details/104353844
今日推荐