はい、クラッシュします。これは私が試したサンプルコードです:
class Program
{
static byte[] arr = new byte[1024 * 1024 * 1024];
static byte[] arr2 = new byte[1024 * 1024 * 1024];
static byte[] arr3 = new byte[1024 * 1024 * 1024];
static byte[] arr4 = new byte[1024 * 1024 * 1024];
static void Main(string[] args)
{
Console.ReadKey();
}
}
これはかなり原始的なテスト プログラムです。一度に全量のデータに確実に到達できる場合を除き、GC によってすでに部分的に再利用されている可能性があるため、クラッシュすることはありません。
localにすることもできます。ただし、 (コードの最適化を使用して)リリース ビルドを作成すると、未使用の配列 (または通常は変数) が最適化されて削除される可能性があるため、次のビットはチャームのように機能します。
static void Main(string[] args)
{
byte[] arr = new byte[1024 * 1024 * 1024];
byte[] arr2 = new byte[1024 * 1024 * 1024];
byte[] arr3 = new byte[1024 * 1024 * 1024];
byte[] arr4 = new byte[1024 * 1024 * 1024];
Console.ReadKey();
}
デバッグ ビルド(コードの最適化なし) では、上記のビットもクラッシュしOutOfMemoryException
ます。
もちろん、対照的なフィールドをそのままにしておくことはできません。したがって、最初のサンプルは、コードがコンパイラによって最適化されているかどうかに関係なくクラッシュします。