首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制Mono GC

控制Mono GC
EN

Stack Overflow用户
提问于 2009-08-30 04:11:39
回答 4查看 1.7K关注 0票数 1

现在,我每隔3-4秒就会遇到一次延迟峰值,因为500ms+花在GCing上。

有谁对控制Mono GC有什么建议吗?即,在增加收集间隔的同时,使其收集内存的n%而不是100%。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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"

票数 2
EN

Stack Overflow用户

发布于 2009-08-30 04:53:00

Mono的GC是Boehm保守的一代GC,我不相信它有任何这些控制。

票数 2
EN

Stack Overflow用户

发布于 2009-08-30 04:40:31

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

我认为处理这个问题的更好的方法是检查你自己的代码。为什么要分配如此多的内存,而有如此多的收集正在进行?您正在运行的硬件是否足以处理代码的用途?您是否可能从某种磁盘缓存方案中受益(因为分配的内存似乎很快就会消失)?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1353059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档