16 GB の RAM を搭載した Windows Server 2008 x64 で .NET アプリケーションを実行しています。このアプリケーションは、非常に大量のデータ (約 64 GB) をフェッチして分析し、一度にすべてのデータをメモリに保持する必要があります。
予想されること: プロセス サイズが 16GB を超えて 64GB に拡大します。Windows は仮想メモリを使用して、必要に応じてディスクとの間で余分なデータをページングします。これは、従来の仮想メモリの使用例です。
私が実際に見たもの:プロセスサイズは物理メモリの量(16GB)に制限されています。アプリケーションは、その時間の 99.8% をガベージ コレクターで費やします。
アプリケーションが仮想メモリを使用できないのはなぜですか? これは、.NET ガベージ コレクターの構成の問題ですか、それとも Windows x64 仮想メモリ マネージャー自体の問題ですか? アプリケーションが物理メモリに制限されるのではなく、仮想メモリを使用するようにするにはどうすればよいですか?
ありがとう。
-- ブライアン
更新: 同じ動作を示す非常に小さなプログラムを作成しました。
using System;
namespace GCTest
{
class Program
{
static void Main()
{
byte[][] arrays = new byte[100000000][];
for (int i = 0; i < arrays.Length; ++i)
{
arrays[i] = new byte[320];
if (i % 100000 == 0)
{
Console.WriteLine("{0} arrays allocated", i);
System.Threading.Thread.Sleep(100);
}
}
}
}
}
試してみたい場合は、必ず x64 用にビルドしてください。システムに負荷をかけるために、定数を少し変更する必要がある場合があります。私が見た動作は、サイズが 16GB に近づくとプロセスが停止することです。エラー メッセージや例外はスローされません。パフォーマンス モニターは、GC の CPU 時間の割合が 100% に近づいていることを報告します。
これは受け入れられませんか?仮想記憶システムはどこにありますか?