Flutter效能監控工具(1)--- Observatory簡介 主要講了如何開啟Observatory,現在講一下如何使用Observatory裡的各個功能來分析效能問題,
下圖是Observatory的主頁面:
最上面的藍色導航欄
表示當前所在的位置
-
vm@ws://127.0.0.1:50579/ws :表示當前連線的VM
滑鼠放在這個上面,會看到這個,表示當前APP的main():
- 右邊的Refresh :重新整理資料
VM
這裡顯示當前VM的資訊
- name : 當前VM的名字
- version :Dart的版本,APP build的時間,執行在哪個平臺上
- embedder :嵌入的平臺
- started at :VM啟動時的時間戳
- uptime :VM已執行的時長
- refreshed at :上次取樣資料的時間
- pid : 程式ID
- peak memory :APP執行時用的峰值記憶體
- current memory : APP當前用的記憶體
- native zone memory :native 原生記憶體
- native heap memory :native 堆記憶體
- native heap allocatioon count : native 堆物件數量
- flag :一些標記位
- timeline :工具
- native memory profile :
Isolates
這裡是顯示APP裡的Isolates,每個APP都有一個root Isolates。
Isolates是用一個餅圖顯示,這個餅圖有很多組成部分,我們把這些叫做tags,這些tags用來代表在VM裡不同的執行列表,包括User TAG 和 VM TAG:
-
User TAG
使用者自定義的TAG,使用方式如下:
import 'dart:developer';
var customTag = new UserTag('MyTag');
// Save the previous tag when installing the custom tag.
var previousTag = customTag.makeCurrent();
// your code here
// Restore the previous tag.
previousTag.makeCurrent();
複製程式碼
-
VM TAG
VM TAG是系統定義的,在整個UI中使用,有:
- CompileOptimized, CompileScanner, CompileTopLevel, CompileUnoptimized :編譯Dart程式碼
- GCNewSpace : 新生代的垃圾收集
- GCOldSpace : 老生代的垃圾收集
- Idle : 不是VM TAG,但是用來標識Isolate空閒的佔比
- Native : 執行Native程式碼,dart:io庫使用的C ++程式碼 或者 平臺相關程式碼(Platform Channel)
- Runtime : 執行 Runtime 程式碼
- Dart : 執行 自己的業務Dart 程式碼
- VM :建立isolate,和其他未被覆蓋的部分
影象的右邊還有一系列連結,代表著不同的功能。
debug
可以設定斷點並除錯您的應用程式。
複製程式碼
如何設定debugger,看 dart-lang.github.io/observatory…
class hierarchy
顯示應用程式的類層次結構。
複製程式碼
cpu profile
顯示當前isolate的CPU使用資料
複製程式碼
圖表的下部按cpu佔用比例做了一個列表,反映的是函式的呼叫次數和執行時間(劃重點)。一般排在前面的函式(這些函式是?有待學習)都不是我們寫的dart程式碼。如果你發現自己的某個函式呼叫佔比反常,那麼可能存在問題。
具體使用的地址:dart-lang.github.io/observatory…
cpu profile (table)
和cpu profile一樣,但是是以表格的形式來展示
複製程式碼
allocation profile
顯示isolate已分配的記憶體。通過這個皮膚你能看到新生代/老生代的記憶體大小和佔比;每個型別所佔用的記憶體大小。
複製程式碼
Heap 堆,動態分配的Dart物件所在的記憶體空間
New generation: 新建立的物件,一般來說物件比較小,生命週期短,如local 變數。在這裡GC活動頻繁 Old generation:從GC中存活下來的New generation將會提拔到老生代Old generation,它比新生代空間大,更適合大的物件和生命週期長的物件
通過這個皮膚你能看到新生代/老生代的記憶體大小和佔比;每個型別所佔用的記憶體大小。 為了debug的方便,我們可以獲取到某段時間的記憶體分配情況:點選Reset Accumulator按鈕,把資料清零,執行一下要測試的程式,點選重新整理。 為了檢查記憶體洩露,我們可以點選GC按鈕,手動執行GC。 Accumulator Size:自點選Reset Accumulator以來,累加物件佔用記憶體大小 Accumulator Instances:自點選Reset Accumulator以來,累加例項個數 Current Size:當前物件佔用記憶體大小 Current Instances:當前物件數量
具體使用的地址:dart-lang.github.io/observatory…
heap snapshot
堆快照
複製程式碼
heap map
將分配的記憶體顯示為顏色塊
複製程式碼
heap map 皮膚能檢視old generation中的記憶體狀態 它以顏色顯示記憶體塊。 每個記憶體頁面(page of memory)為256 KB,每頁由水平黑線分隔。 畫素的顏色表示物件的類ID - 例如,藍色表示字串,綠色表示雙精度表。 可用空間為白色,指令(程式碼)為紫色。 如果啟動垃圾收集(使用“分配配置檔案”螢幕中的GC按鈕),堆對映中將顯示更多空白區域(可用空間)。 將游標懸停在上面時,頂部的狀態列顯示有關游標下畫素所代表的物件的資訊。 顯示的資訊包括該物件的型別,大小和地址。 當你看到白色區域中有很多分散的其它顏色,說明存在記憶體碎片化,可能是記憶體洩露導致的。
具體使用看:dart-lang.github.io/observatory…
metrics
包含您應用中收集的指標。
複製程式碼
persistent handles
檢視強物件和若物件
複製程式碼
ports
埠
複製程式碼
啥也沒有
logging
設定Log的級別
複製程式碼