我有一个在域控制器上运行的服务,该控制器由网络上的其他计算机随机访问。我无法关闭服务并仅在需要时运行它(这无论如何都会破坏将其作为服务运行的目的)。 问题是服务使用的内存似乎永远不会被清除,并且每次远程计算机查询服务时都会增加。 有没有办法对应用程序使用的RAM设置限制?
我发现了一些使用MaxWorkingSet的引用,但没有一个引用实际上告诉我如何使用它。我可以使用MaxWorkingSet来限制使用的RAM,例如35MB吗?如果是的话,怎么样? (语法是什么等?)
否则,是否有" clearall()"等功能?我可以用来在每次运行结束时重置变量和内存?我尝试过使用GC.Collect(),但它没有用。
答案 0 :(得分:0)
从字面上看,MaxWorkingSet
仅影响工作集,即物理内存量。要限制总体内存使用量,您需要作业对象API 。但是如果你的程序确实需要这样的内存(许多代码不考虑OutOfMemoryException,有时.NET运行时在内存不足时会有奇怪的行为),那就很危险了。
你需要:
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
类似,需要手动处理。