分配准确RAM数量的简单方法

本文关键字:简单 方法 RAM 分配 | 更新日期: 2023-09-27 18:29:27

我想创建一个函数,使我的应用程序在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
}

分配准确RAM数量的简单方法

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

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

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

你必须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。

除非写入内存,否则它不会被分配。重复进行垃圾回收不会显著降低内存使用率。该程序在有垃圾收集的情况下增长到1176272K,在没有垃圾收集的条件下增长到了1176312K;当这一行被注释掉时:GC.GetTotalMemory(true);当这一行将被注释掉byteArray[i] = 99;时,程序将增长到4464K

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