【问题标题】:Need C# code that will eat up system memory.需要会占用系统内存的 C# 代码。
【发布时间】:2013-12-31 08:18:30
【问题描述】:

我需要好的、优化的代码的反面。出于测试目的,我需要一个简单的程序来消耗 RAM。最好不是所有的内存,这样操作系统就不能正常工作,但更像是模拟内存泄漏的东西,消耗大量内存并逐渐减慢操作系统的速度。

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

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

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

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

请帮忙。

【问题讨论】:

  • 如果您认为通过在循环中分配托管内存会降低操作系统的速度,那么您对内存的工作原理有很多很多错误的看法。除非你的信念是正确的,否则你不会成功。我将从以下开始:仔细描述 RAM、虚拟地址空间、托管堆、页面文件和工作集之间的关系。一旦你能正确描述所有这些关系,你就可以编写你需要编写的代码。

标签: c# memory memory-leaks


【解决方案1】:

使用

Marshal.AllocHGlobal(numbytes)

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

Marhsal.AllocHGlobal

【讨论】:

  • 每天学习新东西! :) 我会按照@JustinPihony 建议的方式来做,因为我不知道Marshal.AllocHGlobal
  • @Rotem,你说,“只是不要释放内存”。系统不会自动为您执行此操作吗?如何确保内存不被释放?
  • static void Main(string[] args) { timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); start_timer(); Console.Read(); } static void timer_Elapsed(object sender, ElapsedEventArgs e) { IntPtr hglobal = Marshal.AllocHGlobal(100000); Marshal.FreeHGlobal(hglobal); Process proc = Process.GetCurrentProcess(); Console.WriteLine(proc.PrivateMemorySize64); } private static void start_timer() { timer.Start(); }
  • @Rotem,上面是我当前的代码,它没有像我想要的那样耗尽系统内存。请帮忙。
  • 好吧,你正在使用 FreeHGlobal 释放内存,所以没有理由这样做。
【解决方案2】:

设计在下方,问题要求逐渐消耗内存

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

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

确保在 Build 选项卡下的 Project Properties 下以 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();
            
        }

    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 虽然它确实会造成内存泄漏,但它不会消耗大量内存,除非因为该事件而保留在内存中的对象消耗大量内存自身.
    猜你喜欢
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2014-11-25
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多