質問

私のコード:

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. 一貫して得ています メモリ不足例外 RAMが約200MB残っているとき、 なぜ?一度に int を割り当てるため、断片化が原因である可能性はありません。また、すでに 2GB をはるかに超えているため、アドレス指定の問題が原因である可能性はありません (3GB のうち 2.8 個が使用されると例外がスローされます)。テスト アプリによって出力された数値は、横で実行されているタスク マネージャー ウィンドウで確認されました。
  3. 一度、テストアプリの実行中に残り約 400 MB のときに BSOD が発生しました。これの原因について何かヒントはありますか?RAM の整合性のチェックを実行しますが、他に何かありますか?電話をかけるときは気をつけたほうがいいでしょうか PerformanceCounter.NextValue() ループか何かで?この PC で BSOD が発生するのはこれが初めてであることに注意してください。
  4. プログラム実行のいくつかの時点で、大きな遅延が発生します。例えば。1 GB の空き RAM から開始すると、700 MB に達するとアプリが 1 秒間フリーズし、その後約 400 MB になると約 4 秒間フリーズします。どうしてこれなの?OSがメモリを解放するためにディスクキャッシュをスワップアウトする必要があるからでしょうか?

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

役に立ちましたか?

解決

私はすべてのあなたの質問に対処するが、ここでは行くことができません。

2)あなたは、32ビットまたは64ビットのWindows上ではありますか?あなたは(すなわち、32ビットWindows上で)3ギガバイトへのアクセス権を持つ大規模なアドレスを認識プロセスを実行しているように聞こえます。いずれにせよ、あなたはメモリは、様々なサイズのチャックに割り当てられ、あなたのヒープ使用量が唯一の源ではないことを心に留めておく必要があります。 CLR自体は、各スレッドがようにスタックを持っていると、多数の構造を持っています。いずれにせよ、あなたは本当に正確に3ギガバイトを使用できるように期待することはできません、

3)BSODは、ドライバまたはカーネルのエラーに起因するものです。私の知る限り、あなたのアプリケーションがBSODを引き起こすことができないので、これは最も可能性の高い無関係です。

あなたは多くのメモリを使用する場合は、

4)GCが追いついて苦労しています。 GCの特定の部分が進行している間、ユーザスレッドが中断されているように、この大幅にアプリケーションが遅くなります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top