Ответ 1
Использование
Marshal.AllocHGlobal(numbytes)
Вы можете прикрепить его к таймеру. И просто не выпускайте память (не вызывайте FreeHGlobal). Это самый простой, управляемый и предсказуемый способ потребления памяти.
Мне нужно противопоставить хороший, оптимизированный код. Для целей тестирования мне нужна простая программа, чтобы съесть RAM. Предпочтительно не вся память, чтобы ОС была нефункциональной, а скорее как что-то, что могло бы имитировать утечку памяти, используя большую память и замедляя работу ОС, постепенно, сверхурочно.
В частности, может ли кто-нибудь предоставить кодовые спинеты или ссылки на учебные пособия, которые я могу использовать?
Я видел этот код в качестве предложения в другом сообщении:
for (object[] o = null;; o = new[] { o });
Но это не совсем то, что я ищу, как описано выше.
Пожалуйста, помогите.
Использование
Marshal.AllocHGlobal(numbytes)
Вы можете прикрепить его к таймеру. И просто не выпускайте память (не вызывайте FreeHGlobal). Это самый простой, управляемый и предсказуемый способ потребления памяти.
Самый простой способ создать утечку памяти в С# - это привязка к событиям и не удаление. Это то, что я бы сделал, по крайней мере. Вот о чем говорится в этом
Дизайн ниже, вопрос просил постепенно поедать память
Он был разработан для использования 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();
}
}
}