2

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

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

4

1 回答 1

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");
    }
}
于 2012-04-06T23:41:52.213 回答