web-dev-qa-db-ja.com

Windowsプロセス(またはユーザー)のメモリ制限を設定する

プロセスがWindows XPで使用できるシステム全体のメモリ制限を設定する方法はありますか?ほとんどの場合問題なく動作するいくつかの不安定なアプリがありますが、数秒でメモリ全体を消費するバグにぶつかります(または、少なくともそれだけだと思います)。これにより、Windowsが完全に応答しなくなり、作業が失われるため、ハードリセットが発生します。

Linuxで/ etc/limitsのようなことをできるようにしたい-たとえば、M90を設定する(1人のユーザーに割り当てる最大メモリを90%に設定する)。したがって、システムは何があっても残りの10%を取得します。

45
Mike Minicki

Windows ジョブオブジェクト を使用します。ジョブはプロセスグループに似ており、メモリ使用量とプロセスの優先度を制限できます。

36
Adam Mitz

Microsoftの Application Verifier(AppVerifier) ツールを使用します。

私の場合、使用できなくなったメモリをシミュレートする必要があるため、ツールで次の操作を行いました。

  1. 私のアプリケーションを追加しました
  2. 未チェックの基本
  3. 低リソースシミュレーションのチェック
    • TimeOutを120000に変更しました-何かが有効になる前に、私のアプリケーションは2分間正常に実行されます。
    • HeapAllocを100-100%のヒープ割り当てエラーの可能性に変更
    • Stacksをtrueに設定します-スタックはそれ以上大きくなりません
  4. セーブ
  5. アプリケーションを開始する

2分後、プログラムは新しいメモリを割り当てることができなくなり、すべてがどのように処理されるかを確認できました。

23
Jesse Vogt

アプリケーションによっては、言語インタープリターが使用するメモリを制限する方が簡単な場合があります。たとえば、Javaを使用すると、JVMが割り当てられるRAMの量を設定できます。

それ以外の場合は、Windows APIを使用してプロセスごとに1回設定することができます

SetProcessWorkingSetSize関数

4
Eric

私が知っているこれを行う方法はありませんが、誰かが良い答えを持っているかどうかを読むのは非常に興味があります。私は自分の会社が構築するアプリの1つにこのようなものを追加することを考えていますが、それを行う良い方法を見つけていません。

私が考えることができる1つのことは(直接ではありませんが)、WindowsのCOM +アプリケーションの合計メモリ使用量を制限できると信じているということです。もちろん、アプリをCOM +で実行するように作成する必要がありますが、私が知っている最も近い方法です。

ワーキングセットの内容は良好です(ジョブオブジェクトもワーキングセットを制御します)が、それは総メモリ使用量ではなく、実際のメモリ使用量(ページイン)のみです。それはあなたが望むもののために働くかもしれませんが、それは知らない限り、割り当てられたメモリの合計を制限しません。

3
Nick