Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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# 4.0_Garbage Collection - Fatal编程技术网

c#在垃圾收集之前查找特定类的未使用对象

c#在垃圾收集之前查找特定类的未使用对象,c#,c#-4.0,garbage-collection,C#,C# 4.0,Garbage Collection,您好,非常感谢您的帮助 在垃圾收集之前,有没有人有好办法找到特定类的未引用对象?(最好尽快) 在我的例子中,我需要创建一个特定类的许多小对象,这些对象只是临时使用的。问题是我不知道什么时候不再需要这个对象了。我希望在垃圾收集之前(尽快)收集该类中不再被引用的对象,这样我就可以回收它们,而不需要创建新的对象。我认为这将使代码更快 亲切问候,, David您不能直接控制垃圾收集,但可以创建一个管理器类,负责创建、保存引用和处理这些对象。只要manager类在范围内,它的对象就不会被垃圾收集。首先,在

您好,非常感谢您的帮助

在垃圾收集之前,有没有人有好办法找到特定类的未引用对象?(最好尽快)

在我的例子中,我需要创建一个特定类的许多小对象,这些对象只是临时使用的。问题是我不知道什么时候不再需要这个对象了。我希望在垃圾收集之前(尽快)收集该类中不再被引用的对象,这样我就可以回收它们,而不需要创建新的对象。我认为这将使代码更快

亲切问候,,
David

您不能直接控制垃圾收集,但可以创建一个管理器类,负责创建、保存引用和处理这些对象。只要manager类在范围内,它的对象就不会被垃圾收集。

首先,在执行此操作之前,您应该进行广泛的分析,以确定确实存在由收集压力引起的性能问题。垃圾收集器经过高度调优,大部分时间都工作得很好;出于性能原因需要将对象池化的情况很少出现

事实上,我是在这种情况下;我们通过广泛的测试确定,我们一直在临时使用某些对象(“其他对象的构建者”),并且由于频繁重新分配这些对象而造成的收集压力成本是可测量的,而且很高

我们要做的是有一个pool类,它维护一个“blank”对象数组。当您需要一个新对象时,池将检查数组并返回数组中的一个对象(如果有),从而清空数组项。如果没有,它会创建一个新对象。当临时用户处理完对象后,它会将其传递回池中,池将其“清空”并将其粘贴回数组中。(如有必要,增加阵列。)

如果用户忘记将对象放回池中,或者因为在“返回池”调用之前引发了异常而无法这样做,谁在乎呢?在这种情况下,我们所做的只是对未来的分配进行了轻微的去优化。代价是,您需要记住在处理完对象后将其放回池中


据我所知,没有办法“钩住”垃圾收集器自动将垃圾放回池中

是什么让你认为如果你能回收对象,你的代码会快得多?我不认为我在C#中见过这种情况。这些对象的初始化成本高吗?如果没有,你就不太可能意识到任何好处。@Gabe:我正在开发一款游戏,它将通过对某些对象使用对象池得到极大的帮助。这些对象存在的时间相对较短,通常非常相似,并且创建的频率也非常高。一个游泳池完全符合我的需要。哦,我已经做了绩效评估,以了解游泳池将帮助我解决问题。:)也许我不够清楚,所以我再次问:如何识别特定类的未使用(未引用)对象,以便知道何时回收它是有意义的?我不想回收一个可能仍在使用(或至少已被引用)的对象。你的想法是错误的。这是自动发生的。如果不希望回收对象,请将对该对象的引用保留在作用域中,并且不要调用
Dispose()
。使用语句阅读
,这可能会对您有所帮助:谢谢您的帮助,但我认为我们有点误解。我想将特定类中所有未使用(未引用)的对象放在一个特殊的堆栈列表中。当我再次需要该类的对象时,我只是从堆栈列表中弹出一个对象并再次使用它。如果堆栈列表为空,则创建一个新对象。你对弱引用有什么看法?它们是否可以识别未使用(未引用)的对象?你好,大卫这些东西是干什么的?似乎您在试图避免实例化新实例的成本……也许您在寻找单例模式?是的,这是正确的!我试图避免实例化的成本。在我的例子中,我不能使用单例模式,因为我需要多个实例(在某些情况下)。我听说垃圾收集器有一个未引用对象的列表,可以访问该列表吗?最佳的解决方案是,每次有问题的对象未被引用时都会引发一个事件。您是否使用
IDisposable
将对象返回到它们的池中?@Gabe:有趣的是,我们周四刚刚在我的团队中讨论了这个问题。我们决定不,使用IDisposable将对象移回池是不合适的。首先,IDisposable应该用于非托管资源。其次,如果一个对象在特殊情况下被GC回收,那么谁会在乎呢?这种情况是异常的,程序可能会异常终止。第三,如果一个对象没有在正常的终止中返回到池中,那么我们有断言指出事实,所以我们将捕获bug。我认为IDISPOSIDLE对于需要确定性寿命管理的任何东西都是有用的,其中非托管资源是最常见的。我认为IObservable是使用IDisposable的托管对象的最佳示例。在这种情况下,如果合适的话,我可能会选择使用
模式实现IDisposable以启用
。@Eric:我同意@Gabe,
IDisposable
适用于任何应该具有确定生存期的对象。终结器用于非托管资源。(当然,如果你有一个终结器,你应该有一个
Dispose
方法)。但对于源代码,您不需要IDisposable
;你总是可以自己写
试试看。我知道我是少数人,相信“使用”一个