1

私のコード:

var list = new LinkedList<int>();
var ramCounter = new PerformanceCounter("Memory", "Available MBytes");
while (true)
{
    for(int i = 0; i < 1000 * 1000; i++) list.AddLast(0);
    Console.WriteLine(ramCounter.NextValue());
}

質問:

  1. ドキュメントには、PerformanceCounterは管理者としてのみ使用できると記載されているようですが、アプリケーションを標準ユーザーとして実行したところ、機能しました。頼りにできますか?
  2. 約200MBのRAMが残っていると、常にOutOfMemoryExceptionが発生します。なぜですか?一度にintを割り当てるので、断片化が原因ではありません。また、私はすでに2GBをはるかに超えているため、アドレス指定の問題が原因である可能性はありません(3GBのうち2.8が取得されると、例外がスローされます)。テストアプリによって出力された数値は、側面で実行されているタスクマネージャーウィンドウで確認されました。
  3. テストアプリの実行中にBSODを取得すると、約400MBが残っていました。何がこれを引き起こす可能性があるかについてのヒントはありますか?RAMの整合性のチェックを実行します、他に何かありますか?ループなどでの呼び出しには注意が必要PerformanceCounter.NextValue()ですか?このPCでBSODを取得するのはこれが初めてです。
  4. プログラム実行のある時点で、大きな遅延が発生します。たとえば、1 GBの空きRAMで起動すると、700 MBに達すると、アプリは1秒間フリーズし、約400MBで約4秒間フリーズします。どうしてこれなの?OSはメモリを解放するためにディスクキャッシュをスワップアウトする必要があるため、または何か?

注:なぜ私はこれをしているのですか?さて、メモリを大量に消費するアプリで5 MBのRAMが残っていることを検出し、「メモリが不足しています。他のプログラムを閉じてから戻ってください。そうしないと、このプログラムは失敗します」とユーザーに警告します。

4

1 に答える 1

0

すべての質問にお答えすることはできませんが、ここでは

2) 32 ビットまたは 64 ビットの Windows を使用していますか? 3 GB にアクセスする大きなアドレス認識プロセスを実行しているようです (つまり、32 ビット Windows)。いずれにせよ、メモリはさまざまなサイズのチャックに割り当てられ、ヒープの使用量だけが原因ではないことに注意する必要があります。CLR 自体には多数の構造があり、各スレッドにはスタックなどがあります。いずれにせよ、正確に 3 GB を使用できるとは期待できません。

3) BSOD はドライバーまたはカーネル エラーが原因です。私の知る限り、あなたのアプリケーションはBSODを引き起こすことはできないので、これはおそらく無関係です.

4) 大量のメモリを使用すると、GC が追いつくのに苦労します。GC の特定の部分の進行中にユーザー スレッドが中断されると、アプリケーションの速度が大幅に低下します。

于 2009-08-25T17:01:53.083 に答える