C# 需要消耗系统内存的C代码。

C# 需要消耗系统内存的C代码。,c#,memory,memory-leaks,C#,Memory,Memory Leaks,我需要好的,优化的代码的反面。出于测试目的,我需要一个简单的程序来消耗RAM。最好不是所有的内存,这样操作系统就不起作用了,但更像是模拟内存泄漏,消耗大量内存并逐渐使操作系统慢下来 具体来说,谁能提供我可以使用的代码或教程链接 我在另一篇文章中将此代码视为建议: for (object[] o = null;; o = new[] { o }); 但它不完全是我所寻找的根据上述描述 请帮忙 在C#中创建内存泄漏的最简单方法是附加到事件而不是分离。至少我会这么做 使用 Marshal.Alloc

我需要好的,优化的代码的反面。出于测试目的,我需要一个简单的程序来消耗RAM。最好不是所有的内存,这样操作系统就不起作用了,但更像是模拟内存泄漏,消耗大量内存并逐渐使操作系统慢下来

具体来说,谁能提供我可以使用的代码或教程链接

我在另一篇文章中将此代码视为建议:

for (object[] o = null;; o = new[] { o });
但它不完全是我所寻找的根据上述描述


请帮忙

在C#中创建内存泄漏的最简单方法是附加到事件而不是分离。至少我会这么做

使用

Marshal.AllocHGlobal(numbytes)
您可以将其连接到计时器。 不要释放内存(不要调用FreeHGlobal)。 这是最严格、可控和可预测的内存消耗方式

下面的设计是,问的问题逐渐吞噬了记忆

  • 渐渐地耗尽记忆
  • 参数#1是它将消耗的内存(即6000是6千兆字节)
  • 参数#2是每次迭代的逐渐延迟(即1000是1秒)
  • 提交的内存和工作集大致相同
  • 它被设计为使用XmlNode作为占用内存的对象,因为这样,提交内存(操作系统中进程分配的内存)和工作集内存(进程实际使用的内存)将是相同的。如果使用一个primative类型来占用诸如byte[]数组之类的内存,那么工作集通常是空的,因为即使已经分配了内存,该内存实际上也不会被进程使用

    确保在“生成”选项卡下的“项目属性”下的x64中编译。否则,如果它是在x32中编译的,那么它将在1.7Gigs限制附近得到OutOfMemory错误。在x64中,它所消耗的内存将相当“无限”

    使用系统;
    使用System.Xml;
    使用System.Collections.Generic;
    使用System.Linq;
    使用系统文本;
    使用系统线程;
    使用System.Threading.Tasks;
    使用System.Runtime.InteropServices;
    名称空间内存日志
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    WriteLine(“在Megs中消耗的总内存:+args[0]);
    Console.WriteLine(“增量之间的毫秒暂停:“+args[1]);
    int memoryTotalInMegaBytes=Convert.ToInt32(args[0]);
    int secondsToPause=Convert.ToInt32(args[1]);
    WriteLine(“内存使用:+Convert.ToString(GC.GetTotalMemory(false));
    long runningTotal=GC.GetTotalMemory(false);
    long-endingMemoryLimit=Convert.ToInt64(memoryTotalInMegaBytes)*1000*1000;
    List memList=新列表();
    
    while(runningTotal虽然确实会造成内存泄漏,但不会消耗大量内存,除非由于事件而保留在内存中的对象本身消耗大量内存。每天学习新知识!)我会按照@JustinPihony建议的方式来做,因为我不知道
    marshall.AllocHGlobal
    @Rotem,你说“不要释放内存”。系统不会自动为你做这件事吗?我如何确保内存不会被释放?
    static void Main(string[]args){timer.appeased+=new ElapsedEventHandler(timer_appeased);start_timer();Console.Read();}静态无效计时器(object sender,ElapsedEventArgs e){IntPtr hglobal=Marshal.AllocHGlobal(100000);Marshal.FreeHGlobal(hglobal);Process proc=Process.GetCurrentProcess();Console.WriteLine(proc.privatemorysize64);}私有静态void start_timer(){timer.start();}
    @Rotem,以上是我当前的代码,它没有像我所希望的那样使用系统内存。请帮助。好吧,你正在用FreeHGlobal释放内存,所以没有理由这样做。如果你认为通过循环分配托管内存会降低操作系统的速度,那么你对如何使用FreeHGlobal有很多错误的想法emory是有效的。除非你的信念正确,否则你不会成功。我将从以下几点开始:仔细描述RAM、虚拟地址空间、托管堆、页面文件和工作集之间的关系。一旦你能够正确描述所有这些关系,你就能够编写需要编写的代码。
    using System;
    using System.Xml;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Runtime.InteropServices;
    
    namespace MemoryHog
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("    Total Memory To Eat Up in Megs: " + args[0]);
                Console.WriteLine("Millisecs Pause Between Increments: " + args[1]);            
                int memoryTotalInMegaBytes     = Convert.ToInt32(args[0]);
                int secondsToPause             = Convert.ToInt32(args[1]);
    
                Console.WriteLine("Memory Usage:" +     Convert.ToString(GC.GetTotalMemory(false)));
    
                long runningTotal = GC.GetTotalMemory(false);
                long endingMemoryLimit = Convert.ToInt64(memoryTotalInMegaBytes) * 1000 *     1000;
                List<XmlNode> memList = new List<XmlNode>();
                while (runningTotal <= endingMemoryLimit)
                {
                    XmlDocument doc = new XmlDocument();
                    for (int i=0; i < 1000000; i++)
                    {
                        XmlNode x = doc.CreateNode(XmlNodeType.Element, "hello", "");
                        memList.Add(x);
                    }
                    runningTotal = GC.GetTotalMemory(false);
                    Console.WriteLine("Memory Usage:" +     Convert.ToString(GC.GetTotalMemory(false)));
                    Thread.Sleep(secondsToPause);
                }
                Console.ReadLine();
                
            }
    
        }
    }