2

アプリケーションに X RAM を Y 秒間割り当てさせる関数を作成したいと考えています (オブジェクトに 1.2GB の制限があることはわかっています)。

これより良い方法はありますか?

[MethodImpl(MethodImplOptions.NoOptimization)]
public void TakeRam(int X, int Y)
{
    Byte[] doubleArray = new Byte[X];
    System.Threading.Sleep(Y*60)
    return
}
4

3 に答える 3

7

次のように、管理されていないメモリを使用することをお勧めします。

IntPtr p = Marshal.AllocCoTaskMem(X);
Sleep(Y);
Marshal.FreeCoTaskMem(p);

そうしないと、CLR ガベージ コレクターがいたずらをする可能性があります。

于 2013-08-28T06:29:18.237 に答える
1

メモリのブロックが必要KeepAliveです。そうしないと、GC がメモリの割り当てを解除できます。メモリをいっぱいにすることもできます(メモリが実際に割り当てられ、予約されていないことを確認できるように)

[MethodImpl(MethodImplOptions.NoOptimization)]
public void TakeRam(int X, int Y)
{
    Byte[] doubleArray = new Byte[X];

    for (int i = 0; i < X; i++)
    {
        doubleArray[i] = 0xFF;
    }

    System.Threading.Sleep(Y)
    GC.KeepAlive(doubleArray);
}

64 ビットでは、配列の最大サイズは 1.2GB ではなく 2GB 未満です。

于 2013-08-28T06:37:22.093 に答える