2

我想创建一个函数,使我的应用程序在 Y 秒内分配 X RAM(我知道对象有 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

除非您写入内存,否则它不会被分配。重复进行垃圾回收不会显着降低内存使用量。程序在垃圾收集的情况下增长到 1,176,272K,在没有垃圾收集的情况下增长到 1,176,312K;注释掉这一行:GC.GetTotalMemory(true);当注释掉这一行时byteArray[i] = 99;,程序增长到 4,464K

  1. 更改了数组的名称;它没有双打。
  2. 将其更改为写入内存
  3. 更改了睡眠功能的名称。

您可以在任务管理器中看到内存被分配给正在运行的进程:

这有效:

using System;
using System.Runtime.CompilerServices;

namespace NewTest
{
    class ProgramA
    {
        static void Main(string[] args)
        {
            TakeRam(1200000000, 3000000);
        }
        [MethodImpl(MethodImplOptions.NoOptimization)]
        static public void TakeRam(long X, int Y)
        {
            Byte[] byteArray = new Byte[X];
            for (int i = 0; i < X; i += 4096)
            {
                GC.GetTotalMemory(true);
                byteArray[i] = 99;
            }
        System.Threading.Thread.Sleep(Y);
        }
    }
}
于 2013-08-28T06:35:51.487 回答
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 位时,数组的最大大小小于 2GB,而不是 1.2GB。

于 2013-08-28T06:37:22.093 回答