极端内存条件测试:如何使RAM饱和?

我想编写一小段程序来启动线程,以线性方式消耗可用的RAM内存,直到某个级别,并停止(理想情况下,暂停直到“足够”的内存被释放并继续创建线程之后,等等上。)

我尝试了以下,但list.Add(new byte[])需要连续的RAM空间并丢弃OutOfMemoryException ,这不是我想要模拟的。

编辑:
我有一个multithreading内存饥饿的应用程序,它占用了大量的RAM GB。 我想要的是在“实验室条件”中隔离/重现这种情况来解决它,即编写自适应mem监视/线程限制器草案。 我正在使用x64 OS和x64平台。 为了说清楚:我想看到的结果是任务管理器内存监视器由于程序而直接上升。

  static void Main(string[] args) { ComputerInfo ci = new ComputerInfo(); D("TOTAL PHYSICAL MEMORY : " + Math.Round(ci.TotalPhysicalMemory / Math.Pow(10,9),3) +" GB"); //########### Fill Memory ############### var list = new List(); Thread FillMem= new Thread(delegate() { while (Process.GetCurrentProcess().PrivateMemorySize64 < MAX_MEM_LEVEL) { list.Add(new byte[1024 * 10000]); //<- I Need to change this Thread.Sleep(100); } }); FillMem.Start(); //########### Show used Memory ############### Thread MonitorMem = new Thread(delegate() { while (true) { D("PROCESS MEMORY : " + Math.Round(Process.GetCurrentProcess().PrivateMemorySize64 / Math.Pow(10, 6), 3) + " MB"); Thread.Sleep(1000); } }); MonitorMem.Start(); Console.Read(); } 

这个问题仍然令人困惑; 我不清楚你在这里想做什么以及为什么。

如果你真的想要消耗物理内存 – 也就是说,告诉操作系统没有,真的不使用机器中安装的物理RAM芯片的这一部分用于我说的以外的任何东西 – 那么我可能会使用来自非托管代码的恰当命名的AllocateUserPhysicalPages函数。

然后,这将减少可用于其他用途的物理内存量,从而迫使更多虚拟内存页面转到页面文件。

除了让你的机器上运行的所有程序慢得多之外,我不确定你打算通过这个来实现什么。 你能澄清一下吗?

问题是,使用C#你不能在32位.NET框架上增加大约 1.2 GB的RAM。 您的64位计算机上甚至可以有8GB的RAM,但是如果您运行的进程是针对32位架构编译的,一旦达到大约1.2GB,就会导致OutOfMemoryException

对于这种测试,我建议选择其他类型的语言/框架。

编辑

关于主题的良好链接:

是-有-A-内存限制换一个单网过程

如果您遇到的问题是在硬件耗尽物理内存空间之前您的进程耗尽虚拟内存空间那么您可以使用您的代码(以及某些东西)启动一个数字(可能是5个?)处理比如1-2 GB让他们停止,所以他们不会自己OOM)。 它可能不像解决分配内存的非托管调用那么好,但它很容易做到。