分配精确RAM量的简单方法

时间:2013-08-28 06:19:43

标签: c# .net

我想创建一个让我的应用程序为X秒分配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
}

3 个答案:

答案 0 :(得分:7)

我更喜欢使用非托管内存,如下所示:

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

否则CLR垃圾收集器可能会欺骗你。

答案 1 :(得分:1)

除非你写入内存,否则不会分配。执行重复的垃圾收集不会显着降低内存使用量。该程序通过垃圾收集增加到1,176,272K,没有垃圾收集增加到1,176,312 K;使用此行注释掉:GC.GetTotalMemory(true);当此行注释掉byteArray[i] = 99;时,程序将增长到4,464K

  1. 更改了数组的名称;它没有双打。
  2. 将其更改为写入内存
  3. 更改了睡眠功能的名称。
  4. 您可以在任务管理器中看到内存已分配给正在运行的进程:

    这有效:

    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);
            }
        }
    }
    

答案 2 :(得分: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。