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

C# 极端内存条件测试:如何饱和RAM?,c#,performance,C#,Performance,我想写一小段程序,启动线程,以线性方式消耗可用RAM内存,直到达到某个级别,然后停止(理想情况下,暂停直到释放“足够”的内存,然后继续创建线程,依此类推) 我尝试了以下操作,但是list.Add(new byte[])需要连续的RAM空间,并且会删除OutOfMemoryException,这不是我试图模拟的 编辑: 我有一个多线程的内存饥渴的应用程序,它消耗了大量的RAM GB。我只想在“实验室条件”中隔离/重现这种情况以解决它,即编写一份自适应mem监控/线程限制器草案。我使用的是x64操作

我想写一小段程序,启动线程,以线性方式消耗可用RAM内存,直到达到某个级别,然后停止(理想情况下,暂停直到释放“足够”的内存,然后继续创建线程,依此类推)

我尝试了以下操作,但是
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中,直到它被删除为止使用这种技术显然不能分配更多的内存