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

Zol*_*olt 21 c# memory memory-leaks

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

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

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

for (object[] o = null;; o = new[] { o });
Run Code Online (Sandbox Code Playgroud)

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

请帮忙.

Rot*_*tem 21

使用

Marshal.AllocHGlobal(numbytes)
Run Code Online (Sandbox Code Playgroud)

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

Marhsal.AllocHGlobal

  • 好吧,你用FreeHGlobal释放内存,所以没有理由这样做. (2认同)

Cod*_*Org 5

设计如下,提出的问题逐渐耗尽内存

  1. 逐渐耗尽内存
  2. 参数 #1 是以兆字节为单位消耗的内存(即 6000 是 6 Gigs)
  3. 参数 #2 是每次迭代的逐渐延迟(即 1000 是 1 秒)
  4. 提交的内存和工作集将大致相同

它被设计为使用XmlNode作为占用内存的对象,因为这样COMMITTED MEMORY(操作系统中进程分配的内存)和WORKING SET MEMORY(进程实际使用的内存)将是相同的。如果使用基本类型(例如 byte[] 数组)来占用内存,那么工作集通常什么都没有,因为即使分配了内存,进程实际上也不会使用该内存。

确保在“构建”选项卡下的“项目属性”下以 x64 进行编译。否则,如果它是在 x32 中编译的,那么它将在 1.7Gigs 限制附近出现 OutOfMemory 错误。在 x64 中,它消耗的内存将是相当“无限”的。

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

    }
}
Run Code Online (Sandbox Code Playgroud)