2012-02-21 115 views
2

我想编写一个应用程序,该应用程序在服务器上消耗大量内存,以便能够显示与服务器上的内存压力相关的问题。我非常了解C#,但我很好奇什么导致应用程序以可控方式消耗过量内存的最有效方法。例如,我希望能够传递一个消耗x MB内存的参数,并使其消耗到接近该值的某个位置。任何想法,我可能会这样做,将不胜感激。创建内存消耗应用程序

+0

实际上,性能在不同的内存使用情况下可能会有不同的表现。分配一个大块可能与分配很多小块有不同的影响。如果你想要一个好的测试,你应该测试两者。当通过C#中的GC分配内存时,您无法真正控制正在使用的底层内存。直接分配(称为Marshall.Alloc ...)将是一种方法。 – Polity 2012-02-21 02:27:13

+0

您始终可以实施光线跟踪算法并加载大量的几何图形。这将消耗快速和残酷的内存。 – user18490 2015-04-08 19:17:35

回答

3

那不是最简单的方法是只创建您感兴趣的大小的字节数组。要得到你可能需要使用这种技术使用一个以上的阵列非常大的分配。

此外,如果你是如此inclinded你可以的P/Invoke到VirtualAlloc

如果你只需要一个应用程序,你也可以使用Testlimit Sysinternals公司。该实用程序在Mark Russinovich的真棒Pushing the Limits of Windows系列中使用。

+0

这是我的第一个想法,但我第二次猜测它是否真的很容易? – 2012-02-21 04:31:20

+0

是的,你应该能够在分配之后使用'GC.GetTotalMemory'来查看差异 – 2012-02-21 04:34:39

+0

对于我可以分配的内容而言,如果没有得到一个'System.OutOfMemoryException',就会有这个限制。试图跳过1GB总是会导致异常。我可以启动应用程序的多个副本来获得我想要的效果,但是如果为了获得大小为4-8GB的大内存分配,这将是最好的选择。 – 2012-02-21 05:12:24

2

根据什么“内存压力”你正在寻找:

  • BOOT.INI burnmemory设置选项 - http://support.microsoft.com/kb/833721要真正限制可用的内存量。
  • 创建一个程序,只是分配大量的内存,并积极接触它。通过这种方式,您可以看到其他程序如何对内存分配/使用中的缓慢进行反应。
  • 在您有兴趣在地址空间(主要是32位)上创建压力的过程中分配内存。
2

一个这样做可以创建一个字节数组的方式。将输入值从MB转换为字节,然后分配数组。如果你想直接尝试堆栈分配,你可以使用stackalloc