分配准确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
}
我更喜欢使用非托管内存,如下所示:
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
- 更改了数组的名称;它不装双打
- 将其更改为写入内存
- 更改了睡眠功能的名称
您可以在任务管理器中看到,内存被分配给正在运行的进程:
这项工作:
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);
}
}
}