Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中删除非常大的对象#_C#_.net_Windows - Fatal编程技术网

C# 在c中删除非常大的对象#

C# 在c中删除非常大的对象#,c#,.net,windows,C#,.net,Windows,你好。 我是c#新手,GC删除了我的代码无法访问的对象,这让我了解了全局。新的问题是我正在处理一些大的(7-40MB)对象,好的是我不需要一次全部删除它们,那么有没有可能的方法删除一个对象呢? 我试过这个: - create big object X - use big object X X = null; /*so I don't have any referance to it any more*/ GC.Collect(); GC.WaitForPendingFinalizer

你好。 我是c#新手,GC删除了我的代码无法访问的对象,这让我了解了全局。新的问题是我正在处理一些大的(7-40MB)对象,好的是我不需要一次全部删除它们,那么有没有可能的方法删除一个对象呢? 我试过这个:

- 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倍大


谢谢

你不需要这样做。避免呼叫GC。手动收集。因此,如果您不需要同时使用这些对象,只需将它们放在范围之外并构造新对象即可。垃圾收集器足够智能,它会在必要时清理垃圾。例如,如果您有足够的可用内存,它可能不会打扰您,但如果内存开始运行不足,它将收集它们。它是高度优化的。

如果不考虑语法技能,我想说的是,没有可能100%确保对象在需要时被删除
GC根据需要释放内存,调用GC.Collect不会立即释放没有引用的所有对象
它确实会被删除,但不会被删除。调用GC.Collect whitot知道它的实际功能从来都不是一个好主意!别管它,GC知道它做什么。

只有一个问题:您的代码有任何问题吗?内存用完了吗


这感觉就像不要手动调用GC.Collect。如果不小心,会将太多对象升级到第1代,这将使它们的寿命更长

在.NET中,Microsoft当前的实现分离了大型对象(我相信大于84KB),并对它们进行单独管理。因此,根据垃圾收集器的算法(从.NET版本更改为.NET版本),您的大型对象将以不同于普通对象的方式获得垃圾收集


检查大型对象堆的此链接:

获取大型对象(单数)的唯一方法是使用非常大的字符串或数组(可能封装在一个长列表中)。否则,您只有一个由小对象(许多)组成的大型图形。小物件不是问题;如果它不再被引用,GC将在某个点清理它,并压缩空间(取决于GC实现)

如果没有发生这种情况,那么可能您给出了另一个对图形的引用-订阅事件是一种典型的意外操作方式;将其中一个对象添加到仍在使用的列表中也是如此。 一个遗漏的引用可以阻止收集一个大的图形,所以请注意这一点

到目前为止,“修复”很简单;不要调用GC;检查你是否有遗漏的参考资料


然而,另一个问题是,当您有足够大的数组/字符串进入“大对象堆”(LOH)时。LOH没有被压缩,因此您可以在这里遇到碎片问题。一个值得商榷的方法是使用一个锯齿状数组,即1000个长度为1000的数组(加上一个额外的数组来跟踪它们),而不是一个长度为1000000-YMMV的数组。

为什么不使用object.dispose()来处理对象呢@Ulhas:假设他的对象实现了
IDisposable
;如果它不使用流、连接或其他I/O内容,这甚至可能不必要。处理与垃圾收集无关。@ghet,你想解决什么问题?“我的对象很大”不是问题。你有内存泄漏吗?是什么促使你寻找手动gc这些对象的方法?他显然不是以英语为母语的人,因此不需要学习他的语法技能,特别是当你将提及写为标注时。对于信息,我会给你+1,但我没有权利,至于语言部分,试着用中文写些东西,也许你会比我用英语写得更好;)你一针见血,你的链接需要更新。(5年后):-)