Подтвердить что ты не робот

Нужен код С#, который будет потреблять системную память.

Мне нужно противопоставить хороший, оптимизированный код. Для целей тестирования мне нужна простая программа, чтобы съесть RAM. Предпочтительно не вся память, чтобы ОС была нефункциональной, а скорее как что-то, что могло бы имитировать утечку памяти, используя большую память и замедляя работу ОС, постепенно, сверхурочно.

В частности, может ли кто-нибудь предоставить кодовые спинеты или ссылки на учебные пособия, которые я могу использовать?

Я видел этот код в качестве предложения в другом сообщении:

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

Но это не совсем то, что я ищу, как описано выше.

Пожалуйста, помогите.

4b9b3361

Ответ 1

Использование

Marshal.AllocHGlobal(numbytes)

Вы можете прикрепить его к таймеру. И просто не выпускайте память (не вызывайте FreeHGlobal). Это самый простой, управляемый и предсказуемый способ потребления памяти.

Marhsal.AllocHGlobal

Ответ 2

Самый простой способ создать утечку памяти в С# - это привязка к событиям и не удаление. Это то, что я бы сделал, по крайней мере. Вот о чем говорится в этом

Ответ 3

Дизайн ниже, вопрос просил постепенно поедать память

  • Постепенно ест память
  • Параметр № 1 - это память, которую он будет потреблять в мегабайтах (т.е. 6000 - 6 концертов).
  • Параметр № 2 - это постепенная задержка для каждой итерации (т.е. 1000 - 1 секунда)
  • Заданная память и рабочий набор будут вокруг одного и того же

Он был разработан для использования XmlNode в качестве объекта, который занимает память, потому что тогда COMMITTED MEMORY (память, выделенная процессом в ОС) и WORKING SET MEMORY (память, фактически используемая процессом) будет одинаковой. Если примитивный тип используется для захвата памяти, такой как массив byte [], тогда WORKING SET обычно ничего, потому что память фактически не используется процессом, даже если он был выделен.

Обязательно выполните компиляцию в x64 в разделе "Свойства проекта" на вкладке "Сборка". В противном случае, если он скомпилирован в x32, тогда он получит ошибку OutOfMemory вокруг предела 1.7Gigs. В 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();

        }

    }
}