【问题标题】:When does the .net garbage collector do for long running method?.net 垃圾收集器何时执行长时间运行的方法?
【发布时间】:2013-02-08 11:47:49
【问题描述】:

如果我有一个正在做长时间工作的方法(例如进行 Web 服务调用),垃圾收集器会查看该方法使用的内存并将其移动到不同的代,还是忽略该方法直到它已经完成了,然后尝试在以后的数据中收集内存?

我听到一个解释,如果正在进行 Web 服务调用,GC 会查看它,因为它需要很长时间,所以将其标记为第 1 代,然后是第 2 代。现在我们可以拥有大量内存直到稍后阶段才会收集。这是正确的吗?

【问题讨论】:

标签: c# .net garbage-collection clr


【解决方案1】:

当 GC 启动时,它会查看对象根。它不关心这些根是来自方法变量还是实例/静态字段。它不会释放从方法中引用的资源,因为这些引用在方法退出之前是活动的。

【讨论】:

  • 如果它没有在调试模式下运行,则方法引用的资源可能在该方法不再使用引用时立即被清理,即使该方法仍在运行.
  • “它不会释放从方法中引用的资源,因为这些引用在方法退出之前一直存在”。一般情况下并非如此。
【解决方案2】:

方法对 GC 不直接可见,即对它们是无视的。

【讨论】:

    【解决方案3】:

    垃圾收集器不寻找方法。 GC 检查引用。

    简单的例子:如果你定义了一个全局变量,它可以从作用域的每个函数中访问。在您离开范围之前,它不会被收集。 如果你定义了一个局部变量,比如说在函数内部,这个变量使用的内存将在函数返回后被清除(或者 finally 块,如果你从 try/catch 块返回)

    【讨论】:

    • “将在函数返回后被清除” - 我会在那里添加一些关于“一段时间后”的狡猾词 - 它发生的速度取决于很多因素。
    • @Damien_The_Unbeliever 是的,最好在返回后和下次执行 GC 时说。
    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2014-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多