@SergeySerge11

Как освободить память? Вызвать сборку мусора?

GC.Collect() чет не помогает?
Решил потеснить. разные случаи. Изучаю, разные там сегментации, и страничную сегментацию, и виртуальную память. Алгоритмы Кучи.
1. Почему при создании массива Память программы не выделяется( в диспетчере задач),
А выделяется только при заполнении его. Хотя я понимаю, и даже догадался что так будет. Но хочу уточнить.
byte[] arr = new byte[1208000000] // я всегда думал, что  память уже выделена. Но нет
  arr[arr.Length -1 ] =433; // ноль реакции, 
//  тут, если открыть через откладку, то  как только решу открыть arr через отладчик, он загружается. 
  for(....  ) arr[i]=rand;  // только после этого выделена 
for(int i=0;i<size; i +=4096)  // вот так  то же выделяется. 
for(int i=0;i<size; i +=4096 *Coef) // выделяется   ~size/Coef ,     Тут в принципе понятно.

Перейду к вопросу / LВот вполне имеющий право на жизнь код.
{ 
            byte [] buf ;  
            for(;;){
               Socket handler = listenSocket.Accept(); //  это не сервер, просто имитация
               var client = new Client(handler);   
               buf  = client.GetBytes(); // возвращает Что=-то Овер большое допустим 2 Гигабайта
              // но может вернуть и 10 байтов.
              // тем не менее Процесс будет есть памяти, равной максимальному числу GetBytes()
               // то есть в среднем ожидаемое число 100 байтов, и вдруг пришло 2 гб, то сервер будет  занимать 2 гб
           // buf=null;   GC.Collect() не помогают
            // паузы то же не помагают.     
           }
      }

К примеру. Обычно приходит 1мб данных, 0.00001% что придёт гб, как только он придёт массив уже будет 1гб.
А дальше по 1мб, а что если в другом потоке придёт Гб данных, то процесс что будет уже 2гб весить? Или это просто времено так диспетчер показывает?
Ну и Как освободить память? Или просто нужно не допускать такого кода
  • Вопрос задан
  • 127 просмотров
Пригласить эксперта
Ответы на вопрос 1
Griboks
@Griboks Куратор тега C#
Да, есть неочевидный нюанс. Тело цикла или условия не считается сборщиком мусора за отдельную область видимости, поэтому не собирается после каждой итерации. Для решения этой проблемы нужно вынести тело в отдельный метод. Ручной запуск сборки не работает.

P. S.
Ну и держать глобальный указатель на буфер не следует, иначе сборка не сработает по понятным причинам.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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