我想创建一个函数,使我的应用程序在 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
}
我更喜欢使用非托管内存,如下所示:
IntPtr p = Marshal.AllocCoTaskMem(X);
Sleep(Y);
Marshal.FreeCoTaskMem(p);
否则 CLR 垃圾收集器可能会欺骗你。
除非您写入内存,否则它不会被分配。重复进行垃圾回收不会显着降低内存使用量。程序在垃圾收集的情况下增长到 1,176,272K,在没有垃圾收集的情况下增长到 1,176,312K;注释掉这一行:GC.GetTotalMemory(true);
当注释掉这一行时byteArray[i] = 99;
,程序增长到 4,464K
您可以在任务管理器中看到内存被分配给正在运行的进程:
这有效:
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);
}
}
}
你必须拥有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。