需要C#代码会耗尽系统内存。

时间:2013-12-12 18:45:15

标签: c# memory memory-leaks

我需要与良好的优化代码相反。出于测试目的,我需要一个简单的程序来占用RAM。优选地,不是所有存储器使得OS不起作用,而是更像是模拟内存泄漏,耗尽大量存储器并且逐渐加速OS的事情。

具体来说,任何人都可以提供代码spinets或指向我可以使用的教程的链接吗?

我在另一篇文章中看到此代码作为建议:

for (object[] o = null;; o = new[] { o });

但是根据上面的描述,它并不是我想要的。

请帮忙。

3 个答案:

答案 0 :(得分:21)

使用

Marshal.AllocHGlobal(numbytes)

您可以将此附加到计时器。 并且不要释放内存(不要叫FreeHGlobal)。 这是消耗记忆的最直接,可控和可预测的方式。

Marhsal.AllocHGlobal

答案 1 :(得分:3)

  

设计在下面,问题要求逐渐吃掉记忆

  1. 逐渐吃掉记忆
  2. 参数#1是它将以兆字节消耗的内存(即6000是6演出)
  3. 参数#2是每次迭代的渐变延迟(即1000是1秒)
  4. Commited Memory和Working Set将在同一个
  5.   

    它被设计为使用XmlNode作为占用内存的对象,因为COMMITTED MEMORY(由OS中的进程分配的内存)和WORKING SET MEMORY(进程实际使用的内存)将是相同的。如果使用原始类型来占用诸如byte []数组之类的内存,则WORKING SET通常什么都不是,因为即使已经分配了内存,该进程实际上也不会使用该内存。

         

    确保在Build选项卡下的Project Properties下的x64中编译。否则,如果它在x32中编译,那么它将在1.7Gigs限制附近获得OutOfMemory错误。在x64中,它吃掉的内存将非常“无限”#34;。

    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();
    
            }
    
        }
    }
    

答案 2 :(得分:2)

在C#中创建内存泄漏的最简单方法是附加事件而不是分离。这就是我至少要做的事情。 Here is a SO that talks about this