GC.Collect()内存回收问题
发布网友
发布时间:2022-04-23 00:41
我来回答
共3个回答
热心网友
时间:2023-10-09 11:22
对内存管理要求比较高的的项目,为什么要用.net做?
为什么不考虑用C/C++呢
另外一个角度,你对内存进行如此频繁的申请和释放,为什么不考虑同一块内存复用?
//----------补充的回答-------------------
我不知道你的应用是什么,不太清楚你的程序的具体运行过程。
1、并发占用内存的机会有多大?就是说,你一次要申请很大的内存,这个操作,是有时间先后顺序的吗,还是有可能是并发申请的?
如果同一时刻,只有一块大内存正在被使用,那么,你为什么不申请一块足够大的内存,来重复使用呢?
如果同一时刻,有多块大内存正在被使用,那么,这个并发数量,有没有一定的上限呢?如果有,也可以考虑做一个大内存块池,比如一块最大需要100M,同时并发数量为10。你完全可以设计一个最大允许申请10个100M的内存块池,而不是让GC或者Windows的内存管理器来如此频繁的申请和释放。
2、如果每次申请的内存大小差异很大,那估计你要添加一些稍微复杂的算法来管理你的这个申请和释放问题。有一些算法,是专门用来管理程序的内存使用的,可以在网上找一资料参考一下。
3、如果有精力,也可以研究一下GC是如何工作的,用工具看看它的实现源码,看看有没有能够利用的地方。
//-------------再次补充--------------------------
就算是大小由第三方数据来决定,也不能没有一个*。
系统资源毕竟是有限的,在有限的资源上面,做无限的事,那肯定是要想办法才行。
1、你这数据究竟是从哪里来的?网络传送过来的么?
2、由于实在太大的数据处理,而内存又不够大的话,那没办法,我们不能无*的扩充内存,那么,能考虑使用分块处理么?
热心网友
时间:2023-10-09 11:23
程序员根本不应该随意干涉GC的行为,否则99%一定是大幅度影响性能
除非你真的知道自己在干什么
热心网友
时间:2023-10-09 11:23
不要直接调用GC.Collect()。 强制回收所有代资源很有可能造成性能下降。
考虑对消耗内存大的对象,在使用完毕后手动释放。(调用对象的dispose方法)