@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гб весить? Или это просто времено так диспетчер показывает?
Ну и Как освободить память? Или просто нужно не допускать такого кода
  • Вопрос задан
  • 126 просмотров
Пригласить эксперта
Ответы на вопрос 1
Griboks
@Griboks Куратор тега C#
Да, есть неочевидный нюанс. Тело цикла или условия не считается сборщиком мусора за отдельную область видимости, поэтому не собирается после каждой итерации. Для решения этой проблемы нужно вынести тело в отдельный метод. Ручной запуск сборки не работает.

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

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

Войти через центр авторизации
Похожие вопросы