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