ART 和 Dalvik 虛擬機

ART 和 Dalvik 虛擬機

android runtime(ART)是android application用來管理運行時和系統服務的。ART和它的後序Dalvik虛擬機是爲android項目而被創建的。ART作爲運行時執行了Dalvik可執行格式的dex字節碼規範。
ART和Dalvik非常適合執行dex字節碼,所以爲Dalvik開發的app即使你運行在ART上也能運行。然而,一些在Dalvik上能工作的一些技術,在ART上不一定能生效。更多的相關信息請閱讀Verifying App Behavior on the Android Runtime (ART).

ART的一些特性

Ahead-of-time(AOT)Compliation 預編譯

AOT 預編譯特性能夠很大的提升 APP的性能,ART也有着比davlik跟嚴格的安裝時間驗證。
在APP安裝的時候,ART使用dex2oat 工具編譯app,這個工具將DEX文件作爲輸入,然後爲目標設備生成一個可執行的完整app。這個工具能夠很簡單的編譯所有的dex文件。然而,一些後處理工具可能產生一些能被davlik接受的無效dex文件,但是那些文件是不能被ART編譯通過的。如果你需要了解更過信息,閱讀Addressing Garbage Collection Issues

提高了垃圾回收能力

GC 可以影響app的性能,導致顯示出現波浪,卡頓的ui交互,或者其他問題。ART從以下幾點提高了垃圾回收能力。

  • 由兩次GC暫停變爲一次GC暫停(譯者注:GC回收的時候,會出現一種所有線程暫停的狀態,jvm中稱爲stop the world,保證全部對象不再變化,是GC回收對象的基礎)
  • 在GC暫停的時候,併發處理(譯者注:指的是垃圾回收線程併發)
  • 由於特殊原因回收新生代(譯者注:java中這個稱呼的)對象內存會花費更少的時間。
  • 提高了垃圾回收的經濟效益,使並行的垃圾回收處理更及時,這樣的帶來的好處是,FULL GC事件變得基本不可能發生。
  • 壓縮化的GC減少了後臺內存的使用和內存碎片

優化了開發和調試

ART提供了一系列的特性,用於優化開發和調試

提供了簡單的分析器
追溯到歷史,開發者可以使用 TraceView 工具作爲一個簡單的分析器(爲跟蹤application執行而設計的工具),然而TraceView給出有用的提示,它在davlik虛擬機的結果會被每一個方法調用過度交叉,並且使用這個工具能夠顯著的影響運行時候的性能。
ART 增加了專注的簡單的分析器而且沒有任何限制。這提供了一個觀察app運行的精確方式並且沒有明顯的滯緩作用。在Kitkat(譯者注:4.4以後)這個對TraceView的簡單支持被加入到Android中。

支持更多的調試相關的特性

ART支持一些新的調試選項,特別是在在模擬和垃圾回收相關的功能上。例如,你可以看到以下特性
可以在Stack Traces中看到持有怎樣的鎖,並且跳到持有這個鎖的對應線程中去。
可以根據給出的類,知道存在多少個實例對象,並且可以知道有多少個引用持有這個對象。
特殊實例的事件過濾(就像斷點)
可以查看函數的返回值,如果它有返回值的話(使用method-exit事件)
當一個特定的字段被訪問或者修改的時候,可以設置一個field watchpoint 去暫停在程序的執行。
提高了發生exception和crash報告的診斷細節
ART可以提供在發生運行時異常和奔潰足夠的上下文和信息。ART爲ClassCastException,ClassNotFoundException 和 java.lang.NullPointerException 提供了擴展的細節.(新版本的Davlik虛擬機會給java.lang.ArrayIndexOutOfBoundsException 和 java.lang.ArrayStoreException提供擴展的異常拋出細節,這些包括了數組大小和下標越界)
例如,java空指針異常,會提供更多的信息幫助你處理空指針,比如app 嘗試寫操作的數據域,或者嘗試調用的方法。下面是一組示例

java.lang.NullPointerException: Attempt to write to field ‘int
android.accessibilityservice.AccessibilityServiceInfo.flags’ on a null object
reference
java.lang.NullPointerException: Attempt to invoke virtual method
‘java.lang.String java.lang.Object.toString()’ on a null object reference

ART也提供了一些上下文信息幫助報告一個native crash,同時包括了java 棧和本地方法棧的信息。
(譯者注:在jvm的內存模型中,分爲java 方法棧和native 方法棧,兩者的都會發生溢棧,但是兩者需要加以區分)

原文地址 ART and Dalvik

發佈了49 篇原創文章 · 獲贊 11 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章