HELO。 我是c#的新手,我用GC删除了我的代码无法访问的对象。新问题是我正在使用一些大的(7-40 MB)对象,好处是我不需要一次全部,所以是否有任何可行的方法来删除对象? 我试过这个:
- create big object X
- use big object X
X = null; /*so I don't have any referance to it any more*/
GC.Collect();
GC.WaitForPendingFinalizers(); - create next big object ....`
这是否可以保证在GC.WaitForPendingFinalizers();
退出后删除大对象?
我知道我应该改变我的设计以使对象变得更加苛刻,但相信我,我尝试过它,这使逻辑变得复杂。如果没有其他方法我会这样做,代码会增加2或3倍。
谢谢!
答案 0 :(得分:16)
您不需要这样做。避免手动调用GC.Collect
。因此,如果您不需要同时使用这些对象,只需将它们排除在范围之外并构造新对象。垃圾收集器足够智能,必要时会清理它们。例如,如果你有足够的空闲内存,它可能不会打扰,但如果内存开始运行低,它将收集它们。它经过了高度优化。
答案 1 :(得分:1)
在没有提升你的语法技能的情况下,我会说没有办法可以100%确定在你想要的时候删除对象。
GC根据需要释放内存,调用GC.Collect不会立即释放每个对象而没有引用。
它确实被删除了,但不是那时。调用GC.Collect whitout知道它实际上做了什么绝对不是一个好主意!不管它,GC知道它做了什么。
答案 2 :(得分:1)
请勿手动拨打GC.Collect
。如果你不小心,你会将太多的对象提升到第1代,这将使它们的寿命更长。
在.NET中,Microsoft的当前实现将大对象(我相信大约84KB)分开,并且它们可以单独管理。因此,基于垃圾收集器的算法(从.NET版本更改为.NET版本),您的大对象将以不同于普通对象的方式进行垃圾收集。
检查此大型对象堆的链接:http://msdn.microsoft.com/en-us/magazine/cc534993.aspx
答案 3 :(得分:1)
非常多地获取 (单数)大对象的唯一方法是拥有一个非常大的字符串或数组(可能封装在一个长列表中)。否则,你只有一个小对象的图形(很多)。小物件不是问题;如果不再引用,GC将在某个时刻清理它,并压缩空间(取决于GC实现)。
如果没有发生这种情况,那么也许你已经给出了另一个图表参考 - 订阅一个事件是一种偶然做到这一点的经典方式;将一个对象添加到仍在播放的列表中。 单个错过的参考可以保持收集大图,所以请注意。
到目前为止,“修复”很简单;不要叫GC;并检查你没有错过参考。
然而,另一个问题是当你有足够大的arras /字符串进入“大对象堆”(LOH)时。 LOH没有压缩,所以你可以在这里遇到碎片问题。一个可疑的方法是使用锯齿状阵列,即1000个长度为1,000的阵列(加上一个额外的阵列来跟踪它们),而不是长度为1,000,000的单个阵列 - YMMV。
答案 4 :(得分:0)
只有一个问题:您的代码有任何问题吗?记忆耗尽了吗?