并发垃圾收集是否还会挂起应用程序中除运行它之外的所有线程?
让我们考虑一个带有用户界面的桌面应用程序。如果并发集合也将暂停所有线程,那么将其并发是没有意义的,对吧?并发垃圾收集有什么好处?
另外,the MSDN states两个矛盾:
一个。为单线程GUI应用程序启用并发集合是很好的,例如桌面应用程序;和
湾并发垃圾收集会导致性能下降。
所以,我的下一个问题是:
为什么并发收集会导致性能下降?最后,
如果我想从桌面应用程序的垃圾收集器注册通知,该怎么办?根据上面链接的MSDN页面,建议对UI应用程序使用并发集合(默认)。但MSDN也说notifications are not supported for concurrent collections;它们仅支持阻止集合。
答案 0 :(得分:2)
并发垃圾回收不会挂起其他线程,但是如果CPU核心不足,则线程调度代码会挂起线程。
具有并发垃圾收集优势的是UI应用程序,而不是阻止的UI,响应式UI。
如果没有足够的CPU内核,并且同一台机器上有大量线程或应用程序,则进程调度和线程调度会降低性能。
垃圾收集器通知适用于不适用于桌面的服务器。
答案 1 :(得分:1)
添加到hamzakılıç的回答:
不挂起应用程序的线程就是“并发”意味着。
UI应用程序以及任何其他具有实时要求的应用程序。(即,任何需要及时响应异步输入的应用程序。)
...而且,并发GC必须做很多额外的工作(与停止世界的GC相比),以防止发生这样的事情:
v
引用对象o
,变量w
为NULL w
。没什么好看的,但是...... w = v; v = NULL;
v
。这里没什么好看的。o
的引用。o
,w.fubar(...)
Google for“tri-color invariant”如果您想了解更多关于(3)
的信息