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гб весить? Или это просто времено так диспетчер показывает?
Ну и Как освободить память? Или просто нужно не допускать такого кода