当内存要求超过预定义限制时,中止执行算法?

时间:2012-04-06 23:35:47

标签: .net

有没有办法为64位应用程序设置最大内存使用量?

原因:当我的笔记本电脑上运行的64位.net算法/应用程序超出3 GB的内存要求时,我的电脑变得非常慢。 (手动终止程序后,保持缓慢。)我宁愿让算法在超过3GB时终止。

1 个答案:

答案 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");
    }
}