Griboks
@Griboks

Как контролировать память кортежей?

Добрый день.
Необходимо возвращать из метода структуру данных. Для это был выбран тип кортежей. В ходе тестирование оказалось, что сборка мусора работает не как ожидалось - создаётся утечка памяти.
Как правильно создавать, удалять и использовать кортежи с минимальными затратами памяти?
(byte[], byte[]) Test() => (new byte[12345678], new byte[16]);
static void Main(string[] args)
{
   var x = Test();
   for(var i=0;i<10;i++)
      x=Test();
}

Каждая итерация увеличивает расход памяти на 150 мб. Где ошибка?
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
Griboks
@Griboks Автор вопроса, куратор тега C#
Кортежы как и другие значимые типы (как и весть стек метода) не очищаются сборщиком мусора до выхода из текущего метода.

Поэтому остаются мертвые ссылки на массивы, которые не дают сборщику мусора их освободить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@DarkByte2015
А с чего ты взял что тут есть утечка? Да - увеличивает расход памяти, а чего ты ожидал? Ты создаешь на каждой итерации по два массива и сборщик мусора не успевает их утилизировать. По моему это нормально. Лучше подумай как оптимизировать алгоритм чтобы не создавать массивы на каждой итерации. Возможно надо переписать функцию чтобы она принимала ссылки на массивы и заполняла их внутри, а массивы создавались до цикла один раз.
Ответ написан
@basrach
В приведенном примере проблемы нет, утечки быть не может. Если утечка 100% есть, то скорее всего, когда создавали этот пример на основе реального кода, вы упустили важную деталь из-за которой и происходит утечка.
Ответ написан
serafimprozorov
@serafimprozorov
Люблю Erlang....
Вы выделяете на каждую итерацию новый массив, поэтому, естественно, что после каждой итерации размер используемой памяти вырастает.

Как оптимизировать алгоритм зависит от контекста Вашей задачи: что именно Вы делаете с полученными байтами?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы