我想编写一小段程序来启动线程,以线性方式消耗可用的RAM内存,直到某个级别,并停止(理想情况下,暂停直到“足够”的内存被释放并继续创建线程之后等等。)
我尝试了以下操作,但list.Add(new byte[])
需要连续的RAM空间并删除 OutOfMemoryException ,这不是我想要模拟的。
编辑:
我有一个多线程内存饥饿的应用程序,它占用了大量的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<byte[]>();
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();
}
答案 0 :(得分:7)
这个问题仍然令人困惑;我不清楚你在这里想做什么以及为什么。
如果您真的想要消耗物理内存 - 也就是说,告诉操作系统 no,真的不要使用机器中安装的物理RAM芯片的这一部分除了我说的之外的其他任何东西 - 那么我可能会使用来自非托管代码的恰当命名的AllocateUserPhysicalPages函数。
这将减少可用于其他用途的物理内存量,从而迫使更多虚拟内存页面转到页面文件。
除了让你机器上运行的所有程序慢得多之外,我不确定你打算通过这个来完成什么。你能说清楚吗?
答案 1 :(得分:1)
问题在于,使用C#
,您无法在32位.NET框架上增长超过近似 1.2 GB
的RAM。您的64位计算机上甚至可以有8GB的RAM,但如果您运行的进程是针对32位架构编译的,一旦达到大约1.2GB,它将导致OutOfMemoryException
。
对于这种测试,我建议选择其他类型的语言/框架。
编辑
关于主题的良好链接:
答案 2 :(得分:-1)
如果您遇到的问题是在硬件物理内存空间不足之前您的进程耗尽了虚拟内存空间,那么您可以使用代码启动一个数字(可能是5个?)处理(还有一些东西可以阻止它们说1-2 GB因此它们本身并不是OOM)。它可能不像解决分配内存的非托管调用一样好,但它很容易做到。