【问题标题】:Should garbage collection have run by now?垃圾收集现在应该运行吗?
【发布时间】:2016-08-02 06:24:36
【问题描述】:

过去几周我一直在运行一个 C# 应用程序。当我第一次启动它时,它的内存使用量约为 10000K。从那以后,我检查了一下,它的内存占用约为 20000K。

我不太了解 .Net 垃圾收集,但这是否表明我肯定有内存泄漏? GC 现在不应该已经运行了吗?

我在这里阅读了垃圾收集:

https://msdn.microsoft.com/en-us/library/ee787088(v=vs.110).aspx

并且它们对于何时应该运行 GC 具有以下条件:

  • 系统的物理内存不足。 (我还有超过 70000K 的内存可用,所以不应该触发)

  • 托管堆上分配的对象使用的内存 超过可接受的阈值。这个阈值是连续的 随着过程的运行进行调整。 (您如何定义“可接受的”阈值?)

我不应该期望 GC 在几周的时间跨度内运行吗?

【问题讨论】:

  • 人们认为 .NET 不收集垃圾的最常见原因是他们误解了任务管理器向他们显示的内容以及 .NET 如何管理堆。仅仅因为 your 程序的直接内存消耗减少了,这并不意味着 .NET 将内存还给了 Windows。或者,也许你确实有内存泄漏。谁知道?你没有提供一个好的minimal reproducible example
  • 验证是否存在内存泄漏,请不要使用任务管理器。而是使用适当的内存分析器。 Visual Studio 自带一个。
  • 只有在服务器级机器上才能在不运行垃圾收集器的情况下从 10MB 变为 20MB。对于典型的 C# 程序来说,它的内存量非常少,有效地使用机器上的可用 RAM 是使代码快速运行的最佳方式,而 CLR 会尽力利用它。看起来你的程序并没有给它太多机会。只有当您可以让它不断攀升至约 1.5 GB 时,您才会有泄漏。你需要调整你的耳朵之间的阈值:)

标签: c# memory-leaks garbage-collection


【解决方案1】:

我不应该期望 GC 在几周的时间跨度内运行吗?

不,您不应该期望 GC.Collect 及时发生。

当满足以下条件之一时,就会发生垃圾收集 真的:

  • 系统物理内存不足。
  • 托管堆上分配的对象使用的内存超过了可接受的阈值。这个阈值是连续的
    随着流程的运行进行调整。
  • GC.Collect 方法被调用。在几乎所有情况下,您都不必调用此方法,因为垃圾收集器会运行 不断地。此方法主要用于特殊情况 和测试。

阅读本文了解更多fundamental 详细信息。

【讨论】:

    猜你喜欢
    • 2017-03-02
    • 2012-04-21
    • 2019-10-01
    • 2011-11-17
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多