【问题标题】:C# Garbage collection? [closed]C# 垃圾回收? [关闭]
【发布时间】:2015-06-10 01:57:02
【问题描述】:

我现在正在编写一个服务来自动化我的几个例程。现在我真的只是在上个月左右才开始学习 C#,所以我还是相当新的(但到目前为止真的很喜欢它)。我设计了我的服务,它只是在我通过 AppSettings 设置的 5 分钟计时器上运行一个方法,运行一些检查,并在需要时组织一些事情,直到下一个间隔。

我很快意识到我最初做事的方式似乎有一个非常糟糕的内存泄漏。所以我重写了大部分内容以将内容嵌入“使用”块中,然后在完成后处理这些内容。 “使用”块是工作中的一位开发人员向我推荐的,他对我很有帮助,但是当他有工作要做时,我不喜欢过多地打扰他处理我的个人项目。

目前我真的没有遇到内存使用问题,因为它只使用了大约 25Mb 的内存,但是当它启动时,它只使用了大约 8Mb,并且随着每个轮询间隔它爬升.但是一旦它达到 25Mb 的阈值,我可以看到是否下降一点,我假设是垃圾收集在做的事情,然后它爬回 25Mb,然后冲洗并重复。所以我的应用程序内存使用是稳定的,但它似乎比它需要的要高,所以我很好奇。

现在,如果我手动调用 GC.Collect,内存使用量会下降到一半。我意识到这并不理想,因为我已经对此进行了一些研究。但现在我的问题真正归结为,在内存使用和垃圾收集方面,.NET 中是否存在某种默认阈值?我问是因为它可以解释我所看到的。

我确实在Process.MaxWorkingSet Property 上查看了此页面,但我不确定它是否会有所作为,或者是否可能会给我带来问题。

我也尝试运行分析器,但老实说,这对我来说仍然是新事物,我并不完全清楚我在寻找什么。

【问题讨论】:

  • 问题是什么?我建议你不要手动调用 GC.Collect。
  • 我的问题是,在内存使用和垃圾回收方面,.NET 中是否存在某种默认阈值?
  • 我的建议:如果您确定没有泄漏,请不要担心,只要 GC 决定这样做,就让其工作。
  • 你应该阅读这个 - msdn.microsoft.com/en-us/library/ee787088%28v=vs.110%29.aspx - 特别是关于世代和条件的部分。

标签: c# memory-management garbage-collection


【解决方案1】:

垃圾回收的条件

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

系统物理内存不足。

> 托管堆上分配的对象使用的内存 超过可接受的阈值。这个阈值是连续的 在进程运行时进行调整。

GC.Collect 方法被调用。在几乎所有情况下,您都没有 调用此方法,因为垃圾收集器不断运行。 此方法主要用于特殊情况和测试。

> 当垃圾收集器检测到存活率很高时 代,它增加了分配的门槛 代,因此下一个集合的大小为 回收的内存。 CLR 不断平衡两个优先级:不 让应用程序的工作集变得太大而不让 垃圾收集需要太多时间。

这是来自msdn GC article的引用

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 2021-12-20
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多