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