2017-04-02 56 views
-4
  1. 併發垃圾收集是否也掛起應用程序中的所有線程而不是正在運行的應用程序?併發垃圾收集的好處是什麼?

  2. 讓我們考慮一個帶有用戶界面的桌面應用程序。如果一個併發集合也會暫停所有線程,那麼併發集合並沒有意義,對吧?併發垃圾收集有什麼好處?

此外,the MSDN states 2的矛盾:

一個。爲單線程GUI應用程序啓用併發收集是很好的,例如桌面應用程序;和

b。併發垃圾收集會導致性能下降。

所以,我的下一個問題是:

  • 爲什麼會併發收集會導致性能下降?最後,

  • 我該怎麼辦,如果我想從垃圾收集我的桌面應用程序通知註冊?根據上面鏈接的MSDN頁面,建議爲UI應用程序使用併發集合(默認)。但MSDN也表示notifications are not supported for concurrent collections;它們僅支持阻止集合。

  • 回答

    1
    1. 併發垃圾回收不暫停其他線程,但是線程調度代碼掛起線程,如果沒有足夠的CPU內核。

    2. 有一個併發垃圾回收的好處是針對UI應用,不會堵塞UI,反應靈敏的用戶界面。

    3. 如果你沒有足夠的CPU內核,如果你有大量的線程或應用程序的同一臺機器上,進程調度和線程調度會降低性能。

    4. 垃圾收集器通知針對不適用於桌面的服務器。

    +0

    謝謝 「三色不變」,我所產生的所有困惑都源於我做出的一個錯誤假設:所有垃圾收集(包括併發垃圾收集)都暫停所有線程。當它被清除後,回答所有其他問題,你的答案也是如此。 –

    1

    添加到哈姆扎的Kı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(...)

    谷歌。如果您想了解更多關於(3)

    +0

    美麗的答案。我特別喜歡第三點。我會研究「三色不變」。謝謝。儘管我知道併發的含義,但我的混淆是基於我錯誤的假設,即所有垃圾收集暫停所有線程,因此我無法調和併發收集與該理解。我只是沒有通讀它的文檔。非常感謝這樣一個美麗的解釋。 –