2013-02-12 57 views
11

我發現了一些關於Android垃圾收集器的信息,這些信息對我來說是矛盾的。Android垃圾收集器在運行時是否暫停其他應用程序?

的Android Devevelopers指南說:

Android 3.0的設計是對 無論是單核或多核處理器架構上運行的平臺的第一個版本。 Dalvik虛擬機,仿生庫和其他地方的各種 更改爲多核環境中的對稱多處理添加支持 。這些優化可以使所有應用程序都受益,即使那些單線程的應用程序也可以使用 。例如,對於兩個活動核心,如果Dalvik垃圾收集器在第二個核心上運行,單線程 應用程序仍可能會看到性能提升。該系統將安排這 自動「

好了,現在其他的事情

根據此鏈接:The Dalvik Virtual Machine Architecture Android使用標誌和清除的形式給出

目前的策略。 Dalvik垃圾收集器將保留標記 位或指示特定對象爲 「可到達」並因此不應被垃圾收集的位,單獨的來自其他堆內存的。

如果我們檢查標記和清除是如何工作的此鏈接: Mark and Sweep Garbage Collection Algorithm ,我們可以看到這一點:

標記和清除方法的主要缺點是, 那當垃圾收集算法運行時,正常程序執行被暫停。特別是,這可能是與人工用戶交互或必須滿足實時執行約束的 程序中的問題。例如,使用標記和掃描垃圾回收的交互式應用程序 將週期性地變爲無響應。

所以我現在的問題是,它是如何工作的?垃圾收集器在工作時是否暫停一切,還是他能夠在另一個活動處理器內核上完全獨立運行?

回答

11

Dalvik虛擬機在薑餅及以後版本使用與暫停時間通常在5毫秒的晴併發局部收集垃圾收集器。因此,GC正在通過阻止其他應用程序來影響其他應用程序,但併發GC算法能夠最小化這些暫停。

你應該看看:

在一般情況下,垃圾收集理論[Garbage Collection Wiki]解釋說:

  • 停止這世界個垃圾收集器完全停止執行程序運行收集週期

  • 增量和併發垃圾收集器通過 旨在減少這種破壞主程序交錯他們與活動的工作。增量垃圾回收器 以離散階段執行垃圾回收循環,允許在每個階段(有時在某些階段期間)在 之間執行程序。

  • 併發垃圾回收器根本不會停止程序執行,除非可能在程序的執行堆棧被掃描時暫時執行。
2

完全獨立是相當不可能的:垃圾收集器和程序使用相同的內存並且必須以某種方式進行通信。即使是「暫停」的GC,就像Azul(順便說一句,一個好的閱讀:http://www.artima.com/lejava/articles/azul_pauseless_gc.html),有技術暫停。 Dalvik很可能(純粹的猜測,基於在過去15年中IBM,Sun和Oracle等公司在過去15年中涌入JVM的軼事證據和資源)落後於JVM中發現的最新技術,所以我懷疑這種停頓時間會更長。

2

它不會暫停其他應用程序,它可能會暫停您的應用程序。一個標記和掃描不停止所有處理,它只是最簡單的方法。它可能有暫停執行的地方和其他地方沒有的地方。唯一真正的方法是查看Dalvik VM代碼。而且我不會指望它在所有Android版本中都是相同的答案。

相關問題