GC.Collect()内存回收问题

最近用.net做的一个项目,对内存管理方面的要求比较高,经常出现内存不能及时回收的情况,每当我下一次申请一块比较大的内存时就outofmemory了。设计层面不存在问题,... 最近用.net做的一个项目,对内存管理方面的要求比较高,经常出现内存不能及时回收的情况,每当我下一次申请一块比较大的内存时就 outofmemory了。设计层面不存在问题,我就想问下大家,GC.Collect()是不是立即挂起线程,然后进行垃圾回收?我把我想释放的资源 dispose,置null,然后调用GC.Collect(),然后下一次再申请比较大的内存时,程序就挂了,内存溢出。。。
但是让我抓狂的时,有时候可以申请内存,有时候出错。难道是GC.Collcet还没来得及回收???我总不能等着它回收完了我再进行我要的操作吧?用 GC.WaitForPendingFinalizers()竟然也没用。有时还是会挂掉,随机的。。。
我知道一般不应该主动调用 GC.Collect(),但是我情况特殊。
请教百度技术大牛,这种问题你们怎么解决。
补充:1,我的确没有办法提前就确定这个数组的大小,就算我弄个大小为一亿的内存,我也不能保证这个数组一定足够大,因为这个数组的大小是有第三方数据量的大小来决定的。用一块太大的内存,有时候浪费,有时候不够用。
还有,我不需要并发使用内存,或者说这不是我期望的,只是因为我new下一块内存的时候,尽管我已经调用了GC.Collect,上一块内存还是没来得及回收,所以内存不够。
2,我不明白你的这种管理算法是指什么,因为采用的就是微软的IDisposable模式,然后调用GC.Collect来强制回收。
3,GC的回收机制看过一些文章,但大多比较浅,只是说它怎么回收垃圾的,回收哪些垃圾,我这种问题感觉是在我下一次new之前,GC还没回收完,因为我如果我等一下再进行的第二次new,就不会出错。
展开
 我来答
iceser
2010-08-24 · TA获得超过2708个赞
知道大有可为答主
回答量:695
采纳率:100%
帮助的人:460万
展开全部
对内存管理要求比较高的的项目,为什么要用.net做?
为什么不考虑用C/C++呢

另外一个角度,你对内存进行如此频繁的申请和释放,为什么不考虑同一块内存复用?

//----------补充的回答-------------------

我不知道你的应用是什么,不太清楚你的程序的具体运行过程。

1、并发占用内存的机会有多大?就是说,你一次要申请很大的内存,这个操作,是有时间先后顺序的吗,还是有可能是并发申请的?

如果同一时刻,只有一块大内存正在被使用,那么,你为什么不申请一块足够大的内存,来重复使用呢?

如果同一时刻,有多块大内存正在被使用,那么,这个并发数量,有没有一定的上限呢?如果有,也可以考虑做一个大内存块池,比如一块最大需要100M,同时并发数量为10。你完全可以设计一个最大允许申请10个100M的内存块池,而不是让GC或者Windows的内存管理器来如此频繁的申请和释放。

2、如果每次申请的内存大小差异很大,那估计你要添加一些稍微复杂的算法来管理你的这个申请和释放问题。有一些算法,是专门用来管理程序的内存使用的,可以在网上找一资料参考一下。

3、如果有精力,也可以研究一下GC是如何工作的,用工具看看它的实现源码,看看有没有能够利用的地方。

//-------------再次补充--------------------------

就算是大小由第三方数据来决定,也不能没有一个限制。
系统资源毕竟是有限的,在有限的资源上面,做无限的事,那肯定是要想办法才行。

1、你这数据究竟是从哪里来的?网络传送过来的么?
2、由于实在太大的数据处理,而内存又不够大的话,那没办法,我们不能无限制的扩充内存,那么,能考虑使用分块处理么?
leon382
2010-08-23 · TA获得超过1064个赞
知道小有建树答主
回答量:1744
采纳率:0%
帮助的人:994万
展开全部
程序员根本不应该随意干涉GC的行为,否则99%一定是大幅度影响性能
除非你真的知道自己在干什么
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
昨天的日记88
2019-02-03
知道答主
回答量:24
采纳率:0%
帮助的人:2.8万
展开全部
不要直接调用GC.Collect()。 强制回收所有代资源很有可能造成性能下降。
考虑对消耗内存大的对象,在使用完毕后手动释放。(调用对象的dispose方法)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式