2016-06-13 53 views
0

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

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

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

回答

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); 

第三PARAM在GC.Collect()的4.6版本中是告诉运行时是否立即进行垃圾收集。在较早的版本中,GC.Collect()仅通知运行时间并将其退出。

至于一些编程建议,我建议你可以包装一个类的一个查询。查询完成后,该类可以被明确处置。这可能有助于使GC更智能化。

最后,确实有一些.NET框架需要管理自己。像Bitmap.GetHBitmap,他们需要手动处理。

+0

谢谢。我会给出一个去看看会发生什么。 – SeanD

相关问题