有没有办法为 64 位应用程序设置最大内存使用量?
原因:当我的笔记本电脑上运行的 64 位 .net 算法/应用程序超过 3 GB 的内存要求时,我的电脑变得非常慢。(在我手动终止程序后仍然很慢。)我宁愿让算法在超过 3GB 时终止。
有没有办法为 64 位应用程序设置最大内存使用量?
原因:当我的笔记本电脑上运行的 64 位 .net 算法/应用程序超过 3 GB 的内存要求时,我的电脑变得非常慢。(在我手动终止程序后仍然很慢。)我宁愿让算法在超过 3GB 时终止。
您可以检查Process.WorkingSet64属性。
var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
if(currentProcess.WorkingSet64 > 3221225472)
throw new System.OutOfMemoryException("Process memory consumption exceeded 3GB");
如果您想限制内存而不检查它,因为您正在调用外部 API,您可以使用JobObjectWrapper
. 它允许您创建一个进程并限制该进程可以使用的内存量。
JobObjectWrapper 是对 Win32 作业对象的 .NET 抽象。使用此库,您可以创建作业对象、创建进程并将其分配给作业、控制进程和作业限制,并注册各种与进程和作业相关的通知事件。
编辑:来自示例项目:
class Program
{
static bool _isStop = false;
static void Main(string[] args)
{
try
{
using (JobObject jo = new JobObject("JobMemoryLimitExample"))
{
jo.Limits.JobMemoryLimit = new IntPtr(30000000);
jo.Events.OnJobMemoryLimit += new jobEventHandler<JobMemoryLimitEventArgs>(Events_OnJobMemoryLimit);
while (!_isStop)
{
ProcessStartInfo psi = new ProcessStartInfo("calc.exe");
Process proc = jo.CreateProcessMayBreakAway(psi);
Thread.Sleep(100);
}
}
}
catch (Exception){ }
}
/// <summary>
/// The events which fires when a job reaches its memory limit
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
static void Events_OnJobMemoryLimit(object sender, JobMemoryLimitEventArgs args)
{
_isStop = true;
(sender as JobObject).TerminateAllProcesses(8);
Console.WriteLine("Job has reacehed its memory limit");
}
}