C# 极端内存条件测试:如何饱和RAM?
我想写一小段程序,启动线程,以线性方式消耗可用RAM内存,直到达到某个级别,然后停止(理想情况下,暂停直到释放“足够”的内存,然后继续创建线程,依此类推) 我尝试了以下操作,但是C# 极端内存条件测试:如何饱和RAM?,c#,performance,C#,Performance,我想写一小段程序,启动线程,以线性方式消耗可用RAM内存,直到达到某个级别,然后停止(理想情况下,暂停直到释放“足够”的内存,然后继续创建线程,依此类推) 我尝试了以下操作,但是list.Add(new byte[])需要连续的RAM空间,并且会删除OutOfMemoryException,这不是我试图模拟的 编辑: 我有一个多线程的内存饥渴的应用程序,它消耗了大量的RAM GB。我只想在“实验室条件”中隔离/重现这种情况以解决它,即编写一份自适应mem监控/线程限制器草案。我使用的是x64操作
list.Add(new byte[])
需要连续的RAM空间,并且会删除OutOfMemoryException,这不是我试图模拟的
编辑:我有一个多线程的内存饥渴的应用程序,它消耗了大量的RAM GB。我只想在“实验室条件”中隔离/重现这种情况以解决它,即编写一份自适应mem监控/线程限制器草案。我使用的是x64操作系统和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();
}
static void Main(字符串[]args)
{
ComputerInfo ci=新的ComputerInfo();
D(“总物理内存:”+Math.Round(ci.TotalPhysicalMemory/Math.Pow(10,9),3)+“GB”);
//###########填充内存###############
var list=新列表();
Thread FillMem=新线程(委托()
{
while(Process.GetCurrentProcess().PrivateMemorySize64 添加(新字节[1024*10000])/问题是,使用C
时,32位.NET framework上的RAM不能超过大约1.2 GB
。您的64位机器上甚至可以有8GB的RAM,但如果您运行的进程是针对32位体系结构编译的,则一旦到达应用程序,就会导致OutOfMemoryException
火箭1.2GB
对于这种测试,我建议选择其他类型的语言/框架
编辑
关于主题的好链接:
这个问题仍然很令人困惑;我不清楚你在这里想做什么以及为什么
如果你真的想消耗物理内存——也就是说,告诉操作系统不,真的不要将机器中安装的物理RAM芯片的这一部分用于除我所说的以外的任何事情——那么我可能会使用非托管代码中恰当命名的函数
这将减少可用于其他用途的物理内存量,迫使更多虚拟内存页转到页面文件
除了让你的机器上运行的所有程序都慢很多之外,我不确定你打算通过这个来完成什么。你能澄清一下吗?如果你遇到的问题是,在硬件耗尽物理内存空间之前,你的进程耗尽了虚拟内存空间,那么你可以启动一个number(可能是5个?)处理您的代码(以及一些可以在1-2 GB时阻止它们的东西,这样它们自己就不会OOM)。解决方案可能不如分配内存的非托管调用好,但这很容易做到。只需启动visual studio:)你完全把虚拟内存和物理内存混为一谈了——正如它们的名字所暗示的,它们是非常不同的。你关心饱和的是什么——虚拟地址空间,还是RAM芯片上的物理空间?@Eric Lippert:好的,我读过这篇文章:但我还不太熟悉。说实话,我想让我的程序在skyrock上运行任务M管理器内存监视器,所以我想我的目标是物理内存。你是对的:我使用的是x64操作系统和x64编译器。我所描述的实际上发生在我的应用程序中。我只是尝试在测试后在应用程序中实现mem管理之前隔离它successfully@MikaJacobi:如果可能的话,你可以试一下您的应用程序目标是64位平台,因此您将有更大的增长空间。好吧,但这并不能回答问题:如何?:)我在x64平台上编译,正如我在第一条评论中所述。我已经有一个饥饿的应用程序,它吞噬了大量GB,我只想在“实验室条件”中隔离/再现这种情况对付it@MikaJacobi:您实际想要模拟什么?您能提供一个您想要模拟的行为/状态/条件的场景吗?感谢您的关注。正如我在另一条评论中所说的:我有一个多线程的内存消耗应用程序,它会消耗大量RAM GB。我只想在“实验室条件"为了解决这个问题,比如写一个mem监控/线程限制器草稿。@MikaJacobi:你得到了OutOfMemoryException
,所以你实际上模拟了.NET应用程序分配太多内存的情况。如果你不想检查,不要分配太多内存,检查你想要的。@Tigran:你可以有一个OutOfMemoryEx尽管任务管理器中仍然有大量可用的RAM,但这并不是我想要模拟的。我只想看到TM中显示的内存消耗上升。我真的不知道如何更清楚地说明这一点。文章如下:@Mika Jacobi:Firefox不一定会消耗RAM。它会消耗虚拟内存,而e memory manager选择将虚拟内存映射到物理内存,因为Firefox是前台的应用程序,因此具有优先权。如果您将其最小化并启动其他一些内存密集型应用程序,那么操作系统肯定会将Firefox使用最少的页面从RAM中转储到磁盘,并让其他一些应用程序进程将其虚拟内存映射到RAM中。@Mika Jacobi:现在,如果您要做的是分配从未交换到页面文件的虚拟内存,那么您可以通过调用VirtualAlloc并传递page_NOCACHE来完成。当然,这样做是危险的,正如您可以想象的那样;一旦您提交了它,该页面将一直在RAM中,直到它被删除为止使用这种技术显然不能分配更多的内存