并发垃圾收集的好处是什么?

时间:2017-04-02 20:31:31

标签: c# .net multithreading concurrency garbage-collection

  1. 并发垃圾收集是否还会挂起应用程序中除运行它之外的所有线程?

  2. 让我们考虑一个带有用户界面的桌面应用程序。如果并发集合也将暂停所有线程,那么将其并发是没有意义的,对吧?并发垃圾收集有什么好处?

  3. 另外,the MSDN states两个矛盾:

    一个。为单线程GUI应用程序启用并发集合是很好的,例如桌面应用程序;和

    湾并发垃圾收集会导致性能下降。

    所以,我的下一个问题是:

    1. 为什么并发收集会导致性能下降?最后,

    2. 如果我想从桌面应用程序的垃圾收集器注册通知,该怎么办?根据上面链接的MSDN页面,建议对UI应用程序使用并发集合(默认)。但MSDN也说notifications are not supported for concurrent collections;它们仅支持阻止集合。

2 个答案:

答案 0 :(得分:2)

  1. 并发垃圾回收不会挂起其他线程,但是如果CPU核心不足,则线程调度代码会挂起线程。

  2. 具有并发垃圾收集优势的是UI应用程序,而不是阻止的UI,响应式UI。

  3. 如果没有足够的CPU内核,并且同一台机器上有大量线程或应用程序,则进程调度和线程调度会降低性能。

  4. 垃圾收集器通知适用于不适用于桌面的服务器。

答案 1 :(得分:1)

添加到hamzakılıç的回答:

  1. 不挂起应用程序的线程就是“并发”意味着

  2. UI应用程序以及任何其他具有实时要求的应用程序。(即,任何需要及时响应异步输入的应用程序。)

  3. ...而且,并发GC必须做很多额外的工作(与停止世界的GC相比),以防止发生这样的事情:

    • 变量v引用对象o,变量w为NULL
    • GC线程检查w。没什么好看的,但是......
    • GC线程丢失时间片,
    • 应用程序线程集w = v; v = NULL;
    • GC再次运行,检查v。这里没什么好看的。
    • GC完成扫描,从未找到对象o的引用。
    • GC删除对象o
    • 应用程序线程尝试调用w.fubar(...)
  4. Google for“tri-color invariant”如果您想了解更多关于(3)

    的信息