2

これは私のコードです:

public class Class1
{
    public int[][] binArray;
    public Class1()
    {
        binArray = new int[1000][];
        for (int i = 0; i < 1000; i++)
        {
            binArray[i] = new int[61608];
        }
    }
}
class Program
{
    static void Main(string[] args)
    {
        Class1 c1 = new Class1();
        Class1 c2 = new Class1();
        Class1 c3 = new Class1();
        Class1 c4 = new Class1();
        Class1 c5 = new Class1();
        Class1 c6 = new Class1();
        Class1 c7 = new Class1();   // Memory will run out at about this point
        Class1 c8 = new Class1();
        Class1 c9 = new Class1();
        Class1 c0 = new Class1();
        Console.WriteLine();
    }
}

out of memory exceptionClass1は配列を格納するために使用され、24GBのメモリマシンに対して61608 * 4バイトの十分なメモリフラグメントを取得すると思いますが、7番目のクラスを初期化したときになぜそれでもスローされるのですか?

4

4 に答える 4

6

これはほぼ確実に、実行可能ファイルを 32b としてビルドしているためです。メモリが 3GB を超えると、64b マシンで実行した場合でも、それは依然として爆発します。64b としてコンパイルすれば問題ありません。

于 2013-02-25T21:03:47.313 に答える
2

これは、32ビットとして実行しているようです。各クラス インスタンスは約 250 MB のメモリ (1000*61608*4 + オーバーヘッド) を使用するため、7 つのインスタンスが約 1.7 GB のメモリを使用します。これは通常、.NET 32 ビット プロセスがメモリ不足になり、大きなフラグメントを割り当てることができなくなる場所です。

VS 2012 でビルドしている場合AnyCPUは、新しい "Prefer 32bit" オプションがあるため、既定では (既定のターゲット) がまだ x86 をターゲットにしていることに注意してください。このオプションをオフにAnyCPUすると、64 ビット プロセスとしてビルドおよび実行されます。

または、x64 を明示的にターゲットにして、64 ビット プロセスとして実行することもできます。

于 2013-02-25T21:06:06.400 に答える
1

これに関するエンベロープ計算の簡単なバック;

  • 61608 要素の新しい int 配列。配列ポインタに 1 を追加します (これについては修正する必要があります)、したがって 61609
  • 1000 を掛ける = 61609000、配列ポインター用にさらに 1 を追加、61609001
  • intに相当するように4 を掛けるとInt32、1 あたり 246436004 バイトになります。Class1
  • リーフ 1,725,052,028 バイトのインスタンスごとに 7 を掛けClass1ます...おおよそ、配列だけで約 1.6Gbs を見ています。

ここでは、アプリケーション自体がより多くのスペースを占有することになります。メモリ不足の例外の考えられる原因は、システムで発生している可能性があるページングです。OS は、プログラムのメモリが RAM に存在することを保証しません。OSのページファイルの設定は?

于 2013-02-25T21:14:39.733 に答える
0

これは、遭遇することを期待していない「落とし穴」です。

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os-aspx

または新しく更新された URL

http://www.xavierdecoster.com/post/2011/02/15/console-application-visual-studio-gotcha-on-x64-os

「VS2010 for .NET 4.0 で新しい Visual C# コンソール アプリケーションを作成する場合、プロジェクトのデフォルトのターゲット設定は、Visual Studio 2008 のように任意の CPU (MSIL) ではなく x86 プラットフォームをターゲットにすることです」

csproj のプロパティを確認します (特にコンソール アプリケーションの場合)。

于 2013-02-25T21:28:12.897 に答える