有没有办法为64位应用程序设置最大内存使用量?
原因:当我的笔记本电脑上运行的64位.net算法/应用程序超出3 GB的内存要求时,我的电脑变得非常慢。 (手动终止程序后,保持缓慢。)我宁愿让算法在超过3GB时终止。
答案 0 :(得分:4)
您可以查看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");
}
}