Вы можете проверить недвижимость Process.WorkingSet64.
var currentProcess = System.Diagnostics.Process.GetCurrentProcess();
if(currentProcess.WorkingSet64 > 3221225472)
throw new System.OutOfMemoryException("Process memory consumption exceeded 3GB");
Если вы хотите ограничить память без проверки, потому что вы звоните внешних API, вы могли бы использовать JobObjectWrapper
. Это позволяет вам создать процесс и ограничить объем памяти, который может использовать этот процесс.
JobObjectWrapper - это .NET-абстракция над объектом работы Win32. С помощью в этой библиотеке вы можете создавать объекты задания, создавать и назначать процесс заданию, процессу управления и ограничениям работы и регистрировать для различные события уведомления о событиях, связанных с процессом и заданием.
Редактировать: от проекта образца:
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");
}
}
+1, даже если 'thow' не является ключевым словом. –
Я бы предпочел прервать, не проверяя, как я называю внешние API, которые также выделяют память. Это возможно? – willem
@willem: отредактировал мой ответ. –