【问题标题】:How to simulate OutOfMemory exception如何模拟 OutOfMemory 异常
【发布时间】:2011-02-16 11:04:41
【问题描述】:

我需要重构我的项目以使其免受OutOfMemory 异常的影响。

我的项目中使用了大量的集合,通过更改一个参数,我可以使我的程序更准确或使用更少的内存......

好的,这就是背景。我想做的是循环运行例程:

  1. 使用默认参数运行子例程。
  2. 捕获OutOfMemory异常,更改参数,再次尝试运行。
  3. 执行第 2 点,直到参数允许运行子例程而不会引发异常(通常只需要进行一项更改)。

现在,我想测试一下。我知道,我可以自己抛出OutOfMemory 异常,但我想模拟一些真实情况。

所以主要问题是:
有没有办法为我的程序设置某种内存限制,达到之后会自动抛出OutOfMemory 异常?
例如,我想为我的整个程序设置一个限制,假设为 400MB 内存,以模拟系统中有这么多可用内存时的情况。
可以做到吗?

【问题讨论】:

    标签: c# memory-management simulation out-of-memory


    【解决方案1】:

    这看起来像是...System.Runtime.MemoryFailPoint的工作。

    http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

    我认为链接中的示例适合您的情况。将 MemoryFailPoint 设置为您需要的任何级别,然后捕获 InsufficientMemoryException 并相应地调整您的输入参数。

    【讨论】:

    • 看来这个类的工作方式与我所需要的完全相反。它实际上检查是否有一定数量的内存可用(例如,调用MemoryFailPoint(100)可以检查消耗100MB的操作是否可以执行。我需要检查我的程序已经消耗了多少内存。
    【解决方案2】:
    string value = new string('crazy', int.MaxValue);
    

    【讨论】:

    • 字符串值 = 新字符串('c', int.MaxValue);
    【解决方案3】:

    模拟内存不足异常的一个好方法是在虚拟机 (VM) 中运行程序。您可以将虚拟机的最大内存分配设置为足够小的水平,从而对您的程序造成内存压力并引发异常。

    一些开源 VM 是:QEMUxenkvm。 一个好的商业虚拟机是适用于 Mac OS X 的 VMware Fusion 或适用于 Linux/Windows 的 VMware Player。

    【讨论】:

      【解决方案4】:

      我想提出另一种看待这个问题的方法。您不一定要耗尽内存。您只需要监控使用的内存量,并将其与系统总内存进行比较。也许像GC.GetTotalMemory 这样的东西在这里可以用来查看您的应用程序正在使用多少内存。然后perhaps this article 将帮助您获取系统上可用的物理 RAM 总量。

      【讨论】:

      • 好吧,我什至不需要将它与系统内存进行比较,我只需要知道我的程序使用了多少 MB 的 RAM。我需要阅读 GC 的文档...谢谢!
      • 好的...好吧,既然您正在寻找 OutOfMemoryException,我假设您想在某个时候用完以调整以获得最大性能。但是,嘿,如果 GC 方法对您有用,那就太棒了!
      • 好吧,我想我可以使用 GC 方法并在达到某个限制后自行抛出异常。也许是一些后台工作人员......我需要测试它是否可以工作。
      【解决方案5】:
      public void EatMemory()
      {
          List<byte[]> wastedMemory = new List<byte[]>();
      
          while(true)
          {
              byte[] buffer = new byte[4096]; // Allocate 4kb
              wastedMemory.Add(buffer);
          }
      }
      

      除非你有 12gb 的内存,否则应该不会花很长时间 :)

      【讨论】:

      • 嗡嗡嗡嗡! Windows 在 x86 上将应用程序的内存限制为 2GB,我认为在 64 位上它会稍高一些,所以 12GB 无关紧要。
      • 有趣的是,我运行了上面的代码,它很好地破坏了我的电脑。 Windows 变得完全没有响应,最终我到任务管理器看到 Visual STudio 使用 3GB 内存。我没有遇到任何异常,内存使用量一直攀升至大约 3.1GB,然后又回升至 3GB……我有 4GB 内存。
      • @SLC:页面文件可能会保护你免受这种情况的影响,当你注意到你的电脑慢到爬行时,它可能会起作用。
      • 这很奇怪...因为我最近在处理 OOM 异常案例和页面文件根本没有帮助!它是 x86。
      • 如果您想要一些真正有趣的结果,您可以随时禁用您的页面文件。
      【解决方案6】:

      只需分配一个非常大的数组。一旦您的 C# 应用程序达到 1.2-1.6GB 的 RAM 使用量(通常在该范围的较低端,前提是它的目标是 x86),您很可能会开始出现内存不足异常。

      【讨论】:

      • 好的,但是我可以通过自己抛出 OutOfMemory 异常得到相同的结果。我想模拟真实情况并使用一些小数据集进行测试(消耗大约 400MB 的内存而不是 1.6GB)
      • 更好,开始构建每个长度为 1GB 的数组数组。您将能够相当快地复制它。
      猜你喜欢
      • 1970-01-01
      • 2013-08-02
      • 2011-05-29
      • 2015-07-28
      • 2018-06-18
      • 2015-04-25
      • 2016-04-26
      • 2014-07-15
      • 1970-01-01
      相关资源
      最近更新 更多