使用MaxWorkingSet

时间:2016-06-13 04:04:04

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

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

我发现了一些使用MaxWorkingSet的引用,但没有一个引用实际上告诉我如何使用它。我可以使用MaxWorkingSet来限制使用的RAM,例如35MB吗?如果是的话,怎么样? (语法是什么等?)

否则,是否有" clearall()"等功能?我可以用来在每次运行结束时重置变量和内存?我尝试过使用GC.Collect(),但它没有用。

1 个答案:

答案 0 :(得分:0)

从字面上看,MaxWorkingSet仅影响工作集,即物理内存量。要限制总体内存使用量,您需要作业对象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);

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

至于一些编程建议,我建议你可以为一个查询包装一个类。查询完成后,可以显式处理该类。它可能有助于使GC变得更聪明。

最后,确实.NET框架中有一些东西需要自己管理。与Bitmap.GetHBitmap类似,需要手动处理。