Возможно, это не очень хороший вопрос, но я отчаянный. У меня есть небольшая часть кода, и у меня есть утечка памяти, но я не знаю, как ее преодолеть. пожалуйста помоги.Я не могу найти утечку памяти
var nPiece = stream.Length/BufferLen;
var lastPieceLen = stream.Length - (nPiece * BufferLen);
for (int i = 0; i < nPiece + 1; i++)
{
var buffer = new byte[i != nPiece ? BufferLen : lastPieceLen];
stream.Read(buffer, 0, buffer.Length);
using (var chunk = new MemoryStream(buffer))
SsClient.SendChunk(i != nPiece ? (i + 1).ToString() : ((i + 1) + "last"), SsSession, chunk);
buffer = null;
GC.Collect();
}
я разделить большой поток на более мелкие куски и отправить их на службу WCF по методу SsClient.SendChunk(). Предположим, у меня есть файл размером 700 мб, я разделил его на 7 кусков 100 мб кусков и отправлю их по одному. но после того, как этот метод будет выполнен, в памяти будет около 400 мб, что я вижу как утечку памяти. когда я отлаживаю его, я вижу, что память заполняется куском сразу после метода веб-службы SendChunk. Когда метод закончен здесь, я остался с утечкой памяти. GC.collect() тоже не работает. Я даже не понял, почему осталось 400 МБ файла 700 МБ? возможно, это может дать некоторые подсказки, которые я не знаю.
любые идеи?
Возможно, клиент WCF держится за него. Каково поведение, если вы создаете нового клиента на каждой итерации? – leppie
Вы говорите, что я должен создать нового клиента на каждой итерации? Это звучит неплохо. Нет никаких проблем при этом, я просто сделал это так, потому что он выглядел более аккуратным для меня. –
Что значит «видеть это как утечку памяти»? (И почему вы не ждете ожидающих финализаторов?) И вы закрываете поток? –