4

これはをスローしOutOfMemoryExceptionます。

ターゲットフレームワーク.NET3.5、64ビットWindows 2008R2Standardで実行。

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte[] test = new byte[Int32.MaxValue];
        }
    }
}

ドキュメントによると、配列の長さは単純に正の32ビット整数でなければなりませんが、注意すべき制限はそれだけではないようです。

この場合、なぜメモリが不足するのですか?

4

6 に答える 6

8

それは2ギガバイトのRAMです。32 ビット int の最大値は 2147483647 で、メガバイトに変換すると 2048、つまり 2 ギガバイトです。マシンが実際にメモリ不足になっている可能性があります。参照: .NET プロセスが割り当てることができる最大メモリ

于 2012-12-05T16:18:10.707 に答える
6

明らかな「メモリ不足」のセマンティクスに加えて、ヒープの断片化というやや微妙な問題があります。2Gb 以上または RAM が利用可能である可能性がありますが、連続していない可能性があります。

これは断片化として知られています。このような場合に表示できる dotNET 用のヒープ プロファイラーがあります。

于 2012-12-05T16:20:36.557 に答える
1

Int32.MaxValue = 2 147483647バイト=2048メガバイト

このリンクを参照してください

「メモリとアドレス空間の制限」で、「各32ビットプロセスのユーザーモード仮想アドレス空間」および「各64ビットプロセスのユーザーモード仮想アドレス空間」を参照してください。したがって、OSの制限ではないようです。

このリンクをご覧ください

于 2012-12-05T17:00:37.717 に答える
1

これは、マネージ .NET アプリケーション内で作成されたすべてのオブジェクトに対してハードコーディングされたメモリ制限があるために発生することが判明しました。

64 ビットの Windows オペレーティング システムで 64 ビットのマネージ アプリケーションを実行する場合、作成できるオブジェクトのサイズは 2 ギガバイト (GB) 以下です。

 

こちらもご覧ください

于 2012-12-05T17:18:23.263 に答える
1

問題は、「使用可能な」メモリがないことではなく、メモリを断片化しすぎて、配列を作成しようとしてサイズを変更する必要がある場合に、使用可能なメモリの単一のブロックがそれを保持できないことである可能性があります。 .

于 2012-12-05T16:20:29.670 に答える
1

標準の 32 ビット システムでは、RAM サイズが原因でこれは不可能です。メモリがオーバーフローします。64 ビット システムでは、より多くのアドレス空間があるためこれが可能ですが、作成する標準アプリケーションで 32 ビット システムと 64 ビット システムの両方をサポートする必要があるため、推奨されません。

于 2012-12-05T16:19:54.193 に答える