C#StreamWriter和StreamReader内存管理问题,为什么不会使用deallocate内存?

Sam*_*m F 3 c# memory-management memorystream streamwriter streamreader

所以我使用StreamReader使用MemoryStream写入StreamWriter并在此应用程序内部,但内存使用量增加300mb(来自其中一个较大的输入)并且在完成使用后不会释放:

StreamWriter log = new StreamWriter("tempFile.txt");
log.Write(reader.ReadToEnd());
log.Close();

reader.DiscardBufferedData();
reader.Close();
reader.Dispose();
memoryStream.Dispose();
log.Dispose();
GC.Collect();
Run Code Online (Sandbox Code Playgroud)

在此之前和我获得RAM使用之后,它比之前少300 MB,但我不知道为什么.考虑到这里唯一发生的事情就是将读取器中的数据放在文本文件中我不知道为什么甚至需要使用大量内存,我已经做了我能想到的一切来释放内存暂时.有什么我想念的吗?...谢谢.

Jon*_*eet 6

你在看过程本身使用的RAM吗?我不希望这样下去.该过程将依赖于该内存并将其重新用于进一步分配.它不会将其交还给操作系统.这就是.NET倾向于工作的方式.

可以通过一些CLR API调用来丢弃内存 - 但通常我不会.

这并不意味着内存已经泄露 - 它仍然可以被同一个进程使用.例如,如果您再次执行相同的操作,则可能不需要增加堆的大小 - 您会看到内存使用情况在进程级别保持不变.使用CLR perfmon图来查看托管堆中使用的内存,以查看是否存在真正的泄漏.

(对应用程序实际使用的内存量也有各种不同的衡量标准.哪一个很有趣取决于你要做的事情.)

编辑:如果您的代码片段真实地指示了您正在使用的代码,那么有一个更简单的替代方案:流式传输数据.

using (TextWriter writer = File.CreateText("tempFile.txt"))
{
    CopyText(reader, writer);
}

static void CopyText(TextReader reader, TextWriter writer)
{
    char[] buffer = new char[8192];
    int charsRead;
    while ((charsRead = reader.Read(buffer, 0, buffer.Length)) > 0)
    {
        writer.Write(buffer, 0, charsRead);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,除非您实际更改编码,否则可以在不使用TextWriter/ TextReaderpair的情况下执行此操作.

这样你就不需要在内存中使用整个字符串以及它的二进制表示(在MemoryStream)中.你当然还有二进制代表 - 你必须把所有东西写进去MemoryStream吗?