C# 创建占用内存的应用程序

C# 创建占用内存的应用程序,c#,.net,memory-management,C#,.net,Memory Management,我想编写一个在服务器上消耗大量内存的应用程序,以便能够显示与服务器上内存压力相关的问题。我对C#相当了解,但我很好奇,哪种最有效的方法可以使应用程序以可控的方式消耗过多的内存。例如,我希望能够传递一个表示消耗x MB内存的参数,并使其消耗接近该值的某个位置。如果您能想到我该怎么做,我们将不胜感激。取决于您所寻找的“记忆压力”: boot.ini burnmemory选项-真正限制可用内存量 创建一个简单地分配大量内存并主动接触它的程序。通过这种方式,您可以看到其他程序对内存分配/使用缓慢的反应

我想编写一个在服务器上消耗大量内存的应用程序,以便能够显示与服务器上内存压力相关的问题。我对C#相当了解,但我很好奇,哪种最有效的方法可以使应用程序以可控的方式消耗过多的内存。例如,我希望能够传递一个表示消耗x MB内存的参数,并使其消耗接近该值的某个位置。如果您能想到我该怎么做,我们将不胜感激。

取决于您所寻找的“记忆压力”:

  • boot.ini burnmemory选项-真正限制可用内存量
  • 创建一个简单地分配大量内存并主动接触它的程序。通过这种方式,您可以看到其他程序对内存分配/使用缓慢的反应
  • 在您感兴趣的过程中分配内存,以对地址空间造成压力(主要是32位)

    • 一种方法是创建一个字节数组。将输入值从MB转换为字节,然后分配数组。如果您想直接尝试堆栈分配,可以使用。

      最简单的方法不是创建您感兴趣的大小的字节数组。要获得非常大的分配,可能需要使用此技术使用多个数组

      另外,如果您非常喜欢,您可以p/invoke


      如果你只需要一个应用程序,你也可以从系统内部使用。马克·鲁西诺维奇(Mark Russinovich)的精彩系列中使用了此实用程序。

      实际上,性能在不同的内存使用情况下可能表现不同。分配一个大chunck可能会产生与分配许多小chunk不同的影响。如果你想要一个好的测试,你应该测试两者。在C#中通过GC分配内存时,您无法真正控制正在使用的底层内存。直接分配(调用Marshall.Alloc…)将是一种方法。您始终可以实现光线跟踪算法并加载大量几何体。这将快速而残酷地消耗内存。这是我的第一个想法,但后来我又猜测它是否真的那么容易?是的,在分配之前和之后,您应该能够使用
      GC.GetTotalMemory
      来查看差异。在没有“System.OutOfMemoryException”这样做的情况下,我可以分配的内存有一个限制。尝试跳转超过1GB总是导致异常。我可以将应用程序的多个副本旋转起来以获得我想要的效果,但如果有一个解决方案来获得4-8GB大小的大内存分配,那将是最好的选择。