繁体   English   中英

控制Mono GC

[英]Controlling the Mono GC

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

有没有人有关于控制Mono GC的一些指示? 也就是说,在增加收集间隔的同时,收集n%的内存而不是100%。

谢谢

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

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

单声道的连续性是堆叠复制品种 (假设您正在使用内置的Tasklets实现)。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM