2017-07-31 60 views
3

Xamarin Cross-Platform Performance Documentation狀態:(何時)Xamarin.iOS垃圾收集器是否停止整個應用程序?

當SGEN啓動垃圾收集,它會同時回收內存停止應用程序的線程。

我想了解一下幾個細節:

  • 我非常想這適用於Xamarin.iOS?它是否正確?
  • 這是否適用於整個應用程序?那也是非管理方?
    • 本地ui線程是否也停止了?
    • 非託管線程也停止了嗎?例如。由通過P/Invoke包裝的本地庫創建的線程?
  • 是否所有的收集(小和主要)停止線程?或者這隻適用於主要收藏?
  • 以防萬一:行爲在去年有變化嗎?

回答

1

標準的原則同樣適用,你就應該剖析,看看如何發揮出來,你的情況,但這裏有一些答案:

  1. 這當然也適用於Xamarin.iOS。
  2. 是的,這將阻止UI線程。
  3. 我猜想'純非託管'後臺線程,即從本地庫啓動,而不是引用任何託管代碼,不會被阻止,但這是一個猜測。
  4. 次要收藏品也會阻擋,但通常時間更短。

最後,是的,這最近顯著通過添加concurrent garbage collection改變:

傳統上,當Mono的內存管理器確定它應該 執行垃圾收集,收集器不得不暫停所有Mono 正在運行線程,執行垃圾回收,一旦完成, 它重新開始執行這些線程。

併發垃圾收集,我們能夠履行對老一代收藏 (我們稱之爲大集合)大多 同時與您的應用程序 - 它發生在同一時間爲 程序運行。主要收集完成後, 收集器只需在最後一段時間暫停單線程,時間爲非常短的時間段 。

並行GC在Xamarin的當前穩定版本中可用作構建選項(有關詳細信息,請參閱link)。