2016-06-13 17 views
0

ネットワーク上の他のコンピュータがランダムにアクセスするドメインコントローラ上で動作するサービスがあります。私はサービスをシャットダウンすることはできませんし、必要なときにのみ実行します(これはサービスとして実行する目的をとにかく破ります)。 問題は、サービスで使用されているメモリがクリアされていないように見え、リモートコンピュータによってサービスが照会されるたびに増加することです。 アプリケーションで使用されるRAMの制限を設定する方法はありますか?サービスの許容RAMをMaxWorkingSetを使用して制限する

私はMaxWorkingSetを使用することについていくつかの参考文献を見つけましたが、参照のどれも実際にどのように使用するか教えてくれません。 MaxWorkingSetを使用して、使用するRAMを35MBなどに制限できますか?もしそうなら、どのように? (構文は何ですか?)

それ以外の場合は、「ru​​nall()」のような関数を使用して、各実行の最後に変数とメモリをリセットできますか?私はGC.Collect()を使ってみましたが、うまくいきませんでした。

答えて

0

実際には、MaxWorkingSetは物理メモリの量であるワーキングセットにのみ影響します。メモリ全体の使用を制限するには、ジョブオブジェクトAPIが必要です。

  • の作成:あなたのプログラムが本当にあなたがする必要が

    (メモリが足りないときに、多くのコードがOutOfMemoryException例外を考慮していないと、時々、.NETランタイムは、奇妙な行動を持っている)、このようなメモリを必要とする場合しかし、それは危険があります仕事

  • への最大メモリは仕事

Hereにあなたのプロセスを割り当てて設定してWin32のジョブオブジェクト

  • は、.NETのラッパーです。 (.NET 4.6以降用)

    GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; 
    GC.Collect(2, GCCollectionMode.Forced, true, true); 
    

    (古いため時にはは動作しません)

    GC.Collect(2, GCCollectionMode.Forced); 
    

    第三のparam:^reference

    以外にも、あなたはGCのこの方法を試みることができます4.6バージョンのGC.Collect()では、すぐにガベージコレクションを実行するかどうかをランタイムに伝えることです。古いバージョンでは、GC.Collect()は実行時にのみ通知し、その決定を放棄します。

    プログラミングに関するアドバイスの一部として、1つのクエリに対してクラスをラップすることをお勧めします。クラスは、クエリの実行後に明示的に配置することができます。 GCをよりスマートにするのに役立つかもしれません。

    最後に、実際に.NETフレームワークには、自分で管理する必要のあるものがあります。 Bitmap.GetHBitmapのように、それらは手動で配置する必要があります。

  • +0

    ありがとうございました。私はそれを行って、何が起こるか見てみましょう。 – SeanD

    関連する問題