c# - 控制 Mono GC

标签 c# .net mono garbage-collection

现在,我每 3-4 秒就会遇到一次延迟峰值,其中 500 毫秒以上用于 GC。

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

谢谢

最佳答案

我担心,如果您无法控制您的 GC 实现,对此类问题的唯一回答将给您有用的结果是“停止创建这么多对象”。

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

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

似乎单声道编译器/JIT 将这些副本存储在托管代码中,因此使用工作产出比较低的延续可能会导致相当多的 GC 开销。因此,您对 GC 时间量的问题强烈表明您正在以某种方式使用协同例程,其中实现方面在一定程度上超过了您在实际协同例程中花费的时间

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

您还可以转向使用(完全可移植的)yield 返回结构的基于枚举的模型,该结构只会在第一次调用时创建对象,而不是在可能是净赢的所有 yield 上创建对象。显然代码需要重写,如果您使用嵌套结构,这将不会执行得很好。 有关这方面的指南,请参阅 the section headed "C# Yield Statement in Mono"在 Unity 中使用。

关于c# - 控制 Mono GC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1353059/

相关文章:

c# - Nunit - 测试 exe

c# - 切换到 Linux Debian 上的程序

c# - 从特定数字获取枚举

c# - 从 Powershell 调用的 DLL 的当前目录错误

c# - 调用返回字符串数组的函数

c# - 如何在 WinForms 中显示包含详细信息的消息框?

c# - ToString() 在字符串上使用时会产生新字符串吗?

Android Loopback地址(10.0.2.2)未连接

c# - C#/.NET 作为新标准游戏开发平台的可行性?

c# - ASP.NET 中用户控件和页面的通用基类