现在,我每隔3-4秒就会遇到一次延迟峰值,因为500ms+花在GCing上。
有谁对控制Mono GC有什么建议吗?即,在增加收集间隔的同时,使其收集内存的n%而不是100%。
谢谢
发布于 2009-08-30 07:19:54
我担心,在缺乏对GC实现的控制的情况下,对这类问题的唯一答案就是“停止创建这么多对象”。
对您的特定需求的特定答案是您对延续的使用。
单声道中的延续是stack copying variety的。(假设您使用的是内置Tasklets实现)。
似乎mono编译器/JIT将这些副本存储在托管代码中,因此使用工作量与产品率较低的延续可能会导致相当多的GC开销。因此,您的GC时间问题强烈表明您正在以一种方式使用协同例程,其中实现方面超出了您在实际协程中花费的时间。
如果你非常依赖continuations来获得性能,你可能会考虑在系统的那个方面使用非托管代码中的不可移植的替代方案(因为它们在windows CLR上不受支持,这不会让你失去太多的可移植性)。
你也可以使用一个基于枚举的模型,利用(完全可移植的)输出返回结构,它只会在第一次调用时创建对象,而不是在所有的输出中创建,这可能是一个净赢家。显然,代码需要重写,如果您使用嵌套构造,这将不会执行得很好。有关这方面的指南,请参阅Unity中使用的the section headed "C# Yield Statement in Mono"。
发布于 2009-08-30 04:53:00
Mono的GC是Boehm保守的一代GC,我不相信它有任何这些控制。
发布于 2009-08-30 04:40:31
如果它的设计类似于.NET GC (我假设是这样的),那么您可能不能这样做,但是您不应该这样做。垃圾收集器比你更清楚计算机内存中发生了什么。
我认为处理这个问题的更好的方法是检查你自己的代码。为什么要分配如此多的内存,而有如此多的收集正在进行?您正在运行的硬件是否足以处理代码的用途?您是否可能从某种磁盘缓存方案中受益(因为分配的内存似乎很快就会消失)?
https://stackoverflow.com/questions/1353059
复制相似问题