我想创建一个让我的应用程序为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
}
答案 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
您可以在任务管理器中看到内存已分配给正在运行的进程:
这有效:
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。