【问题标题】:Console.WriteLine and Memory LeaksConsole.WriteLine 和内存泄漏
【发布时间】:2012-07-24 21:06:47
【问题描述】:

我正在尝试减少我拥有的控制台应用程序的内存使用量。它应该连续运行几个小时,但似乎内存使用量每秒都在逐渐增加。它确实使用了多个线程,并且做了很多事情,但我在某处读到,对 Console.WriteLine 进行大量调用也会导致内存峰值。

由于应用程序一直在向控制台写入,我认为可能是内存使用量是因为这个。不幸的是,我无法轻松清除控制台,因为我将输出重定向到监视窗口。我暂时关闭了它,但内存仍在增加,这告诉我还有其他事情需要解决。

在我开始寻找内存泄漏之前,我想知道是否有人可以确认/验证拥有数千个 Console.WriteLine 是否会导致内存泄漏,或者重定向的输出缓冲区是否已经正确处理了这种情况。我已经尝试进行搜索,但没有找到太多相关信息。

【问题讨论】:

  • 是什么让您认为您所看到的是泄漏?内存使用可能会增加,直到有足够的压力来保证收集;根据您的代码和它运行的环境,这可能需要很长时间。每秒有多少内存泄漏,应用程序在做什么? Console.WriteLine 消耗的内存不应超过缓冲区中消息占用的内存,除非我错过了一些东西......

标签: c# memory-leaks console console.writeline


【解决方案1】:

Console.WriteLine 进行数千次调用不会导致内存泄漏。我有一个长时间运行的程序(现在已经运行了 6 个月),它每分钟向控制台写入几百行,并且它的内存使用率保持不变。

可能一次不频繁地写入数千行可能会由于临时字符串而导致内存峰值,但这些将在下次运行 GC 时收集。但是Console.WriteLine 的稳定负载只会导致未收集字符串的稳定内存负载。它不会一直增加。

【讨论】:

  • 实际上,情况并非总是如此。虽然 Console.WriteLine 是线程安全的,但如果您确实从多个线程调用它,您将得到一个句柄泄漏,其中其他线程上的事件/信号量不会关闭。我已经在 Win2003 .NET 4 中验证了这一点。我还没有尝试过其他平台。
猜你喜欢
  • 2010-12-02
  • 2013-11-08
  • 2016-05-03
  • 2011-11-25
  • 2010-11-19
  • 2014-09-27
  • 2013-07-31
  • 2011-04-03
  • 1970-01-01
相关资源
最近更新 更多