控制Mono GC

时间:2009-08-30 04:11:39

标签: c# .net mono garbage-collection

现在我每隔3-4秒遇到延迟峰值,其中500毫秒+用于GCing。

有没有人对控制Mono GC有一些指示?即在增加收集间隔时,让它收集n%的内存而不是100%。

由于

4 个答案:

答案 0 :(得分:2)

我担心,如果没有对GC实现的控制,那些能给你带来有用结果的问题的唯一答案就是“停止创建这么多对象”。

您特定需求的具体答案是您对延续的使用。

单声道的延续属于stack copying variety。 (假设您正在使用内置的Tasklets实现)。

单声道编译器/ JIT似乎将这些副本存储在托管代码中,因此使用具有较低工作比率的continuation可能会导致相当多的GC开销。因此,您对GC时间量的问题强烈建议您使用协同例程,其实现方面超过您在实际协程中花费一定时间的时间。

如果您依赖于性能的延续,您可能需要考虑使用非便携式替代方案(因为它们在Windows CLR上不受支持,这不会使您失去很多可移植性)在非托管代码中你的系统。

您也可以使用(完全可移植的)yield返回构造转移到基于枚举的模型,这种构造只会在第一次调用时产生对象,而不是所有可能是净赢的产量。显然代码需要重写,如果你使用嵌套结构,这也不会表现得那么好。 有关此指南,请参阅Unity中使用的the section headed "C# Yield Statement in Mono"

答案 1 :(得分:1)

如果它的设计类似于.NET GC(我认为是这样),你可能不会。但是你不应该这样做。垃圾收集器比你知道计算机内存中发生了什么更好。

我认为处理这个问题的更好方法是检查自己的代码。你为什么要分配这么多的内存,以至于有如此多的收集?您运行的硬件是否足以处理代码的用途?你是否可以从一些磁盘缓存方案中受益(因为分配的这么多内存似乎在短时间内消失了)?

答案 2 :(得分:1)

Mono的GC是Boehm保守的代GC,我不相信这些控件。

答案 3 :(得分:0)

如果您正在使用mono via mod_mono,请查看mod_mon配置参数,这些参数允许您在多次请求后让服务器回收。当然,这是一个粗略的解决方案,但它确实有助于避免流程规模的持续增长 http://linux.die.net/man/8/mod_mono
请参阅MonoAutoRestartMode,MonoAutoRestartRequests,MonoAutoRestartTime

相关问题