【问题标题】:Limiting the allowed RAM for a service, possible using MaxWorkingSet限制服务允许的 RAM,可以使用 MaxWorkingSet
【发布时间】:2016-10-13 09:27:08
【问题描述】:

我有一个在域控制器上运行的服务,网络上的其他计算机可以随机访问该服务。我无法关闭该服务并仅在需要时运行它(这将违背将其作为服务运行的目的)。 问题是服务使用的内存似乎永远不会被清除,并且每次远程计算机查询服务时都会增加。 有没有办法对应用程序使用的 RAM 设置限制?

我找到了一些关于使用 MaxWorkingSet 的参考资料,但没有一个参考资料真正告诉我如何使用它。我可以使用 MaxWorkingSet 将 RAM 限制为例如 35MB 吗?如果是这样,如何? (语法等是什么?)

否则,是否有像“clearall()”这样的函数可以用来在每次运行结束时重置变量和内存?我尝试过使用 GC.Collect(),但没有成功。

【问题讨论】:

    标签: c# memory-management service memory-leaks process


    【解决方案1】:

    从字面上看,MaxWorkingSet 只影响工作集,也就是物理内存的数量。要限制整体内存使用,您需要 Job Object API。但是如果你的程序真的需要这样的内存是很危险的(很多代码不考虑 OutOfMemoryException 并且有时 .NET 运行时在内存不足时会出现奇怪的行为)

    你需要:

    • 创建一个 Win32 作业对象
    • 设置作业的最大内存
    • 将您的流程分配给工作

    Here 是 .NET 的包装器。 ^reference

    此外,您可以尝试这种 GC 方法:(适用于 .NET 4.6 或更高版本)

    GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
    GC.Collect(2, GCCollectionMode.Forced, true, true);
    

    (对于较旧但有时不起作用)

    GC.Collect(2, GCCollectionMode.Forced);
    

    GC.Collect() 4.6 版本中的第三个参数是告诉运行时是否立即进行垃圾收集。在旧版本中,GC.Collect() 只通知并将决定留给运行时。

    至于一些编程建议,我建议您可以为一个查询包装一个类。该类可以在查询完成后显式释放。它可能有助于让 GC 更智能。

    最后,确实在 .NET 框架中有些东西需要您自己管理。和Bitmap.GetHBitmap一样,需要手动处理。

    【讨论】:

    • 谢谢。我会试一试,看看会发生什么。
    猜你喜欢
    • 2011-06-18
    • 2019-10-14
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2011-08-21
    相关资源
    最近更新 更多