c#内存溢出异常 “System.OutOfMemoryException”类型的未经处理的异常在 System.Data.dll 中发生

why070809123 2017-02-14 10:56:33
内存明明很充足的,不知道为什么就是报内存不足的异常,而且虽然是同一个异常但每次报异常的地方还不一样。。。
...全文
6418 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_15182741 2020-01-21
  • 打赏
  • 举报
回复
问一下,之后你是用什么软件测试出来是多长时间异常的呢?我现在也配到你说的情况,求 帮助
why070809123 2017-02-20
  • 打赏
  • 举报
回复
引用 17 楼 baidu_34633664 的回复:
我这新手都看出问题了你5000*90000要多大啊,另外你每个循环都是用gc.collect没效果还占资源,最大的问题就是gc.collect调用太多次,把这句删除,估计就恢复正常。全程没有对象close clear,你的这个gc是虾忙。你自己跑10000次gc.collect也会卡死
这个gc不是清除当前类的垃圾,而且清除上一次运行这个类产生的垃圾的。。。。而且大的不是5000*90000,大的是1<<24,出问题的原因不是没内存了,而是有内存但是没法放进去。
baidu_34633664 2017-02-17
  • 打赏
  • 举报
回复
我这新手都看出问题了你5000*90000要多大啊,另外你每个循环都是用gc.collect没效果还占资源,最大的问题就是gc.collect调用太多次,把这句删除,估计就恢复正常。全程没有对象close clear,你的这个gc是虾忙。你自己跑10000次gc.collect也会卡死
why070809123 2017-02-17
  • 打赏
  • 举报
回复
昨天上午不知道为啥自己就好了,不过为了防止再出这个bug我费了九牛二虎之力还是把一些大的数组给拆了!
why070809123 2017-02-15
  • 打赏
  • 举报
回复
引用 14 楼 qq_34798533 的回复:
x86 x64?报错时内存用了多少?
64位系统,报错时内存用了4.3g
xiaoyu5425 2017-02-15
  • 打赏
  • 举报
回复
x86 x64?报错时内存用了多少?
why070809123 2017-02-15
  • 打赏
  • 举报
回复
好吧,是我的问题。。。

   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可用,现在的问题是我不修改数组的大小,或者说把数组拆分会变得非常麻烦.
xdashewan 2017-02-14
  • 打赏
  • 举报
回复
引用 2 楼 why070809123 的回复:
我也想贴代码上去,关键不是某一个位置抛异常,是异常的位置到处跑。
发代码的目的是为了看下错误可能产生的情况
足球中国 2017-02-14
  • 打赏
  • 举报
回复
肯定是代码问题了,要么无限循环了,要么递规无限制调用了,要么事件,方法循环触发了。
why070809123 2017-02-14
  • 打赏
  • 举报
回复
想看一下有没有人遇到过类似的问题,是怎么解决的?
why070809123 2017-02-14
  • 打赏
  • 举报
回复
我也想贴代码上去,关键不是某一个位置抛异常,是异常的位置到处跑。
xdashewan 2017-02-14
  • 打赏
  • 举报
回复
没有代码无法分辨
足球中国 2017-02-14
  • 打赏
  • 举报
回复
你就抛出一句话,让大家猜着玩嘛?
  • 打赏
  • 举报
回复
你自己要先用心观察,然后几乎 80% 以上的概率保证你“操作几步就能把 bug 重现出来”。有个这个过程,再贴调试信息。 如果你干等着 bug,那顶多就是一个产品售后维护人员(而且是只做手工录入操作的维护人员),而不是一个开发人员。
  • 打赏
  • 举报
回复
引用 3 楼 why070809123 的回复:
想看一下有没有人遇到过类似的问题,是怎么解决的?
将来你测试比较多了,就会明白测试跟调试的本质区别了。 测试的人是强者、他设计测试用例,他知道bug越早调出来越好。而仅仅调试的人是弱者,他祈求上苍别让bug出现。
  • 打赏
  • 举报
回复
引用 2 楼 why070809123 的回复:
我也想贴代码上去,关键不是某一个位置抛异常,是异常的位置到处跑。
你用自己特意设计的操作步骤立刻重现bug。不是让你坐在那里干等着bug它自己出现。 这是一个态度问题,想明白、接受这个,你才能开始调试代码问题。
why070809123 2017-02-14
  • 打赏
  • 举报
回复
http://blog.sina.com.cn/s/blog_47642c6e0102vh0v.html应该是这个问题...
why070809123 2017-02-14
  • 打赏
  • 举报
回复
引用 4 楼 zanfeng 的回复:
肯定是代码问题了,要么无限循环了,要么递规无限制调用了,要么事件,方法循环触发了。
跟循环没关系,在循环之外也会报错。
why070809123 2017-02-14
  • 打赏
  • 举报
回复
引用 5 楼 xdashewan 的回复:
[quote=引用 2 楼 why070809123 的回复:] 我也想贴代码上去,关键不是某一个位置抛异常,是异常的位置到处跑。
发代码的目的是为了看下错误可能产生的情况[/quote] 那我觉得要把整个项目都贴上来。。。。

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧