Смягчить это, я Разделите работу на более мелкие партии. Вместо того, чтобы отправлять все 8000 сообщений одновременно, я 100 сообщений на работу .
после 100 сообщений отправляются , я планирую Новая задача Hangfire внутри самой задания с 6-секундной задержкой , и это продолжается до тех пор, пока все сообщения не будут обработаны.
Однако, Даже после завершения задания память кучи Gen2 продолжает увеличивать и не выпущена, даже после вызова gc.collect () вручную . < Br /> ниже, на рисунке вы можете увидеть зигзагообразные шаблоны, представляющие каждую обработанную задание и память о куче, Gen 2 остается или увеличивается. Здесь "src =" https://i.sstatic.net/82vbu44t.png "/>
после всех заданий завершена; Отделенная память кучи Gen2 остается, никогда не выпускается, Я не уверен, когда она будет выпущена.
[*] оптимизированное использование памяти < /strong>: утилизация объектов, используя операторы < /code>, где это применимо. < /li>
< Strong> Ручная сборы мусора [/b]: явно вызывает gc.collect () в конце каждой работы. Работа работают отдельно и не делятся в состоянии некачественного состояния. Эта память не выпущена. < /li>
< /ul>
Несмотря на эти усилия, память продолжает накапливаться, пока приложение не закончится из памяти. < /p>
< H3> Вопросы ключей:
- Почему Hangfire вызывает рост памяти Gen2, даже если задания завершены?
- Почему GC.Collect () восстанавливает эту память?
- Как я могу убедиться После каждого выполнения задания?
Обновление: < /strong>
Вот самый разыскиваемый пример кода: < /p>
Перед оптимизацией это было Посмотрим так: < /p>
Код: Выделить всё
public static class Cron
{
public static void JobSendSMS()
{
// Do some DB reads here
...
foreach( var recipient in recipients)
{
var dictRecipientNumbers = new Dictionary();
var someClass = new SomeClass().Where(s=>s.Conditions).First();
var someAnotherClass = new SomeAnotherClass().Where(s=>s.Conditions).First();
var someString = formatSomeString(someClass.Data);
// and a bunch of other variable definitons
dictRecipientNumbers.Add(someData, someAnotherData);
// And more lines
}
}
< /code>
Чтобы предотвратить любые повторные распределения кучи Я переместил все определения переменных непосредственно перед циклом, как ниже: < /p>
// Do some DB reads here
...
Dictionary dictRecipientNumbers = new Dictionary();
SomeClass someClass = null;
SomeAnotherClass someAnotherClass = null;
String someString = "";
// A bunch of other variables moved here
foreach( var recipient in recipients)
{
someClass = new SomeClass().Where(s=>s.Conditions).First();
someAnotherClass = new SomeAnotherClass().Where(s=>s.Conditions).First();
var someString = formatSomeString(someClass.Data);
// and a bunch of other variable definitons
dictRecipientNumbers.Add(someData, someAnotherData);
// And other lines
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... oesnt-clea