限制服务允许的 RAM,可能使用 MaxWorkingSet
Limiting the allowed RAM for a service, possible using MaxWorkingSet
我有一项服务 运行 在域控制器上,网络上的其他计算机随机访问该服务。我无法仅在需要时关闭该服务并 运行 它(无论如何,这将破坏 运行 将其作为服务的目的)。
问题是服务使用的内存似乎永远不会被清除,并且每次远程计算机查询服务时都会增加。
有没有办法限制应用程序使用的 RAM?
我找到了一些关于使用 MaxWorkingSet 的参考资料,但 none 的参考资料实际上告诉了我如何使用它。我可以使用 MaxWorkingSet 将使用的 RAM 限制为 35MB 吗?如果是这样,怎么办? (语法等是什么?)
否则,是否有像 "clearall()" 这样的函数可以用来在每个 运行 结束时重置变量和内存?我试过使用 GC.Collect(),但没用。
从字面上看,MaxWorkingSet
只影响Working set,也就是物理内存的大小。要限制整体内存使用,您需要 Job Object API。但是如果你的程序真的需要这样的内存是危险的(许多代码不考虑 OutOfMemoryException 并且有时 .NET 运行时在内存不足时会有奇怪的行为)
您需要:
- 创建 Win32 作业对象
- 设置作业的最大内存
- 将您的流程分配给作业
Here is a wrapper for .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()
是告诉runtime是否立即进行垃圾回收。在旧版本中,GC.Collect()
仅通知并将决定留给运行时。
至于一些编程建议,我建议您可以为一个查询包装一个 class。 class 可以在查询完成后显式处理。它可能有助于使 GC 更智能。
最后,.NET Framework 中确实有些东西需要您自己管理。和Bitmap.GetHBitmap
一样,需要手动销毁。
我有一项服务 运行 在域控制器上,网络上的其他计算机随机访问该服务。我无法仅在需要时关闭该服务并 运行 它(无论如何,这将破坏 运行 将其作为服务的目的)。 问题是服务使用的内存似乎永远不会被清除,并且每次远程计算机查询服务时都会增加。 有没有办法限制应用程序使用的 RAM?
我找到了一些关于使用 MaxWorkingSet 的参考资料,但 none 的参考资料实际上告诉了我如何使用它。我可以使用 MaxWorkingSet 将使用的 RAM 限制为 35MB 吗?如果是这样,怎么办? (语法等是什么?)
否则,是否有像 "clearall()" 这样的函数可以用来在每个 运行 结束时重置变量和内存?我试过使用 GC.Collect(),但没用。
从字面上看,MaxWorkingSet
只影响Working set,也就是物理内存的大小。要限制整体内存使用,您需要 Job Object API。但是如果你的程序真的需要这样的内存是危险的(许多代码不考虑 OutOfMemoryException 并且有时 .NET 运行时在内存不足时会有奇怪的行为)
您需要:
- 创建 Win32 作业对象
- 设置作业的最大内存
- 将您的流程分配给作业
Here is a wrapper for .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()
是告诉runtime是否立即进行垃圾回收。在旧版本中,GC.Collect()
仅通知并将决定留给运行时。
至于一些编程建议,我建议您可以为一个查询包装一个 class。 class 可以在查询完成后显式处理。它可能有助于使 GC 更智能。
最后,.NET Framework 中确实有些东西需要您自己管理。和Bitmap.GetHBitmap
一样,需要手动销毁。