代碼分析的哈勃望遠(yuǎn)鏡-Observatory

Google 的 Dart 團(tuán)隊推出了新一代代碼分析工具卷胯,并為之取名“天文臺” Observatory陨囊,讓我這個大氣物理專業(yè)的學(xué)生頓生親切感苍蔬。迫不及待地試乘試駕過后麦牺,發(fā)現(xiàn)確實名副其實惰蜜。

VM-IsolateList

  • 得到代碼執(zhí)行的各個函數(shù)所耗費時間昂拂。
  • 檢查內(nèi)存和CPU的資源分配。
  • 檢查代碼行是否被執(zhí)行--Code Coverage
  • 調(diào)試內(nèi)存泄漏抛猖。
  • 調(diào)試內(nèi)存碎片格侯。

豪車的配置和我們的座駕也都差不多,但帶來的尊貴體驗的享受卻是天上地下财著,所有的這些功能都是圖形化的联四,可點擊進(jìn)一步跟蹤代碼詳情,還可以通過命令行 動態(tài)輸入?yún)?shù)和代碼 來調(diào)試輸出結(jié)果撑教。
因為都是圖形化的朝墩,用顏色塊來區(qū)分成功、失敗或問題伟姐,輕點鼠標(biāo)就能不斷深入地探索宇宙的奧秘收苏。這種感覺,確實就像抬頭仰望星空愤兵。

一鹿霸、開始使用

aqueduct servebin/main.dart 兩種方式都支持啟動 Observatory。 當(dāng)使用aqueduct serve 運行應(yīng)用程序時秆乳,添加--observe標(biāo)志懦鼠,

aqueduct serve --observe

Observatory將開始在端口8181上進(jìn)行監(jiān)聽,并且Web瀏覽器將自動打開屹堰。我們先看看Code Coverage

圖形化代碼覆蓋率

二肛冶、 Observatory常用術(shù)語

1.垃圾回收(GC)

垃圾收集Garbage collection是搜索堆以查找和回收應(yīng)用程序不再使用的“dead”內(nèi)存區(qū)域的過程。 此過程允許重新使用內(nèi)存双藕,并最大限度地降低應(yīng)用程序內(nèi)存不足的風(fēng)險淑趾,避免導(dǎo)致內(nèi)存崩潰。
垃圾收集由Dart VM自動執(zhí)行忧陪。 在Observatory中扣泊,您可以通過點擊 Allocation Profile 屏幕中的GC 按鈕按需執(zhí)行垃圾收集。

2.堆棧Heap

Dart對象被動態(tài)地分配在內(nèi)存的一部分中嘶摊,稱為堆棧heap延蟹。 當(dāng)沒有指向它的時候,或者當(dāng)應(yīng)用程序終止時叶堆,從堆棧中分配的對象將被釋放(符合垃圾回收的條件)阱飘。 當(dāng)沒有指向一個對象時,它被認(rèn)為是死的dead。 當(dāng)一個對象被另一個對象指向時沥匈,它是活的live蔗喂。 查看dart 參考頁面.

3.隔離Isolates

Dart支持通過隔離isolates的方式執(zhí)行并發(fā)執(zhí)行,您可以將其視為進(jìn)程而無需開銷高帖。 每個隔離區(qū)都有其自己的內(nèi)存和代碼缰儿,不受其他隔離區(qū)的影響。 有關(guān)更多信息散址,請參閱 The Event Loop and Dart乖阵。
每個Dart應(yīng)用程序至少包含一個名為root的隔離區(qū)。 當(dāng)您啟動Observatory時预麸, VM screen會列出應(yīng)用程序的所有隔離區(qū)瞪浸。 您可以通過單擊該隔離區(qū)的名稱,單獨瀏覽每個隔離區(qū)并與其進(jìn)行交互吏祸。

4.內(nèi)存碎片Memory fragmentation

內(nèi)存碎片Memory fragmentation 發(fā)生在空閑內(nèi)存被分割成小塊散布在整個分配內(nèi)存中時对蒲。 這種現(xiàn)象會對應(yīng)用程序的性能產(chǎn)生負(fù)面影響,并可能導(dǎo)致內(nèi)存不足異常犁罩。
你可以使用Observatory的堆映射Heap map找到內(nèi)存碎片齐蔽。 此功能顯示用以白色色塊表示空閑內(nèi)存。 如果有許多小白色區(qū)域遍布在有色區(qū)域中床估,則表明應(yīng)用程序的內(nèi)存碎片過多需要優(yōu)化。 有關(guān)更多信息诱渤,請參閱Heap Map丐巫。

5.內(nèi)存泄漏Memory leak

內(nèi)存泄漏memory leak 通常發(fā)生在當(dāng)一個對象處于活動狀態(tài)時(意味著另一個對象指向它)但它沒有被使用(所以它不應(yīng)該有其他對象的引用)時。 這樣的對象不能被垃圾回收勺美,所以它占用堆中的空間并且造成內(nèi)存碎片memory fragmentation递胧。 內(nèi)存泄漏給虛擬機(jī)VM 帶來了不必要的壓力,并且很難調(diào)試赡茸。

6.新一代New generation

新一代New generation 是指大多數(shù)新創(chuàng)建的對象(除非它們非常大)分配在堆的一部分中缎脾。 新一代特別適合臨時和短暫的對象 - 它很小,設(shè)計得很快就能收集垃圾占卧。

7.老一代Old generation

當(dāng)一個對象已經(jīng)存在了一段時間并且在垃圾收集周期中存活下來時遗菠,它通常被提升為堆的一部分,我們稱之為老一代old generation华蜒, 它為新創(chuàng)建的對象釋放新一代辙纬。
Observatory 的heap map 功能為您提供了一種可視化瀏覽老一代old generation的方式。 有關(guān)更多信息叭喜,請參閱Heap Map贺拣。

8.虛擬機(jī)Virtual machine (VM)

Dart虛擬機(jī)是一個可以直接執(zhí)行Dart代碼的軟件。 Dartium瀏覽器是包含Dart VM的特殊版本的Chromium,可以運行Dart代碼譬涡,而無需預(yù)先將其編譯為JavaScript闪幽。
當(dāng)您將Dart web app 編譯為JavaScript時,您可以在任何現(xiàn)代瀏覽器中運行它涡匀。

三盯腌、測試用的本地數(shù)據(jù)庫

Dart通常使用PostgreSQL 數(shù)據(jù)庫。
運行自動化測試的應(yīng)用程序默認(rèn)使用以下配置連接到數(shù)據(jù)庫:

username: dart
password: dart
host: localhost
port: 5432
databaseName: dart_test

在本地安裝PostgreSQL之后渊跋,您可以通過運行以下命令來創(chuàng)建與此連接信息匹配的數(shù)據(jù)庫用戶和數(shù)據(jù)庫:

aqueduct setup

Aqueduct測試會創(chuàng)建一個臨時數(shù)據(jù)庫schema腊嗡,該模式與dart_test數(shù)據(jù)庫中的應(yīng)用程序schema相匹配。 測試完成后拾酝,該數(shù)據(jù)庫中的表格和數(shù)據(jù)將被銷毀燕少。 出于這個原因,在這個數(shù)據(jù)庫中不應(yīng)該創(chuàng)建其他表以避免與測試沖突蒿囤。 Aqueduct測試的這種默認(rèn)行為由test harness提供客们。

四、運行應(yīng)用程序的本地數(shù)據(jù)庫

獨立于測試數(shù)據(jù)庫的本地數(shù)據(jù)庫材诽,用于本地運行應(yīng)用程序底挫。 您可以通過運行psql來打開PostgreSQL終端并運行以下命令來在本地創(chuàng)建數(shù)據(jù)庫:

CREATE DATABASE my_local_app_db;
CREATE USER my_local_app_user WITH PASSWORD 'mypassword';
GRANT ALL ON DATABASE my_local_app_db TO my_local_app_user;

通過生成并執(zhí)行遷移腳本將您的schema添加到本地數(shù)據(jù)庫:

aqueduct db generate
aqueduct db upgrade --connect postgres://my_local_app_user:mypassword@localhost:5432/my_local_app_db

五、使用本地配置文件

使用配置文件 configuration files 來管理應(yīng)用程序連接到哪個數(shù)據(jù)庫脸侥。 根據(jù)開發(fā)團(tuán)隊的偏好建邓,這可以加入到源代碼管理中。 控制哪個文件使用命令行選項加載到aqueduct servebin/main.dart腳本中:

aqueduct serve -c local.yaml

六睁枕、根據(jù)情景分配腳本

為了測試客戶端應(yīng)用程序官边,您通常會希望在本地數(shù)據(jù)庫中擁有一組特定的數(shù)據(jù)。 創(chuàng)建bin腳本以配置數(shù)據(jù)庫并添加所需的數(shù)據(jù)外遇。 例如注簿,您可能有一個名為bin/ios_integration.dart的腳本,它重新設(shè)置數(shù)據(jù)庫并使用您的應(yīng)用程序中聲明的 Query<T> 實例和ManagedObject<T>向其中插入數(shù)據(jù)跳仿。

import 'dart:io';
import 'package:myapp/myapp.dart';

Future main() async {
  await provisionDatabase();

  var defaultUser = new User(...);
  var query = new Query<User>()..values = defaultUser;
  await query.insert();

  ...
}

Future provisionDatabase() async {
  var commands = [
    "CREATE DATABASE local_app;",
    "CREATE USER local_user WITH PASSWORD 'local';",
    "GRANT ALL ON DATABASE local_app TO local_user;"
  ];

  await Future.forEach(commands, (cmd) {
    List<String> args = ["-c", cmd, "-U", grantingUser];
    return Process.run("psql", args, runInShell: true);
  });
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诡渴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子菲语,更是在濱河造成了極大的恐慌妄辩,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谨究,死亡現(xiàn)場離奇詭異恩袱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)胶哲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門畔塔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事澈吨“迅遥” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵谅辣,是天一觀的道長修赞。 經(jīng)常有香客問我,道長桑阶,這世上最難降的妖魔是什么柏副? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蚣录,結(jié)果婚禮上割择,老公的妹妹穿的比我還像新娘。我一直安慰自己萎河,他們只是感情好荔泳,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著虐杯,像睡著了一般玛歌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擎椰,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天支子,我揣著相機(jī)與錄音,去河邊找鬼达舒。 笑死译荞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的休弃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼圈膏,長吁一口氣:“原來是場噩夢啊……” “哼塔猾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起稽坤,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丈甸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尿褪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體睦擂,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年杖玲,在試婚紗的時候發(fā)現(xiàn)自己被綠了顿仇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖臼闻,靈堂內(nèi)的尸體忽然破棺而出鸿吆,到底是詐尸還是另有隱情,我是刑警寧澤述呐,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布惩淳,位于F島的核電站,受9級特大地震影響乓搬,放射性物質(zhì)發(fā)生泄漏思犁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一进肯、第九天 我趴在偏房一處隱蔽的房頂上張望激蹲。 院中可真熱鬧,春花似錦坷澡、人聲如沸托呕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽项郊。三九已至,卻和暖如春斟赚,著一層夾襖步出監(jiān)牢的瞬間着降,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工拗军, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留任洞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓发侵,卻偏偏與公主長得像交掏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刃鳄,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盅弛,服務(wù)發(fā)現(xiàn),斷路器叔锐,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981閱讀 15,912評論 2 11
  • Getting Started Burp Suite 是用于攻擊web 應(yīng)用程序的集成平臺挪鹏。它包含了許多工具,并為...
    Eva_chenx閱讀 28,688評論 0 14
  • 2017年10月20號愉烙,再過一會就是21號了讨盒。其實,今年是非常特殊的一年步责,經(jīng)歷了太多太多返顺,從臺灣回到家禀苦,似乎又是回...
    hanshankangkang閱讀 128評論 0 0
  • 毛旭天: 一定要把所看到的觀點,和自己的觀點區(qū)分開來创南。并且一定要分的清晰伦忠,分的明白。 熊乾琳: 我喜歡現(xiàn)在不推脫稿辙,...
    柳濤虹閱讀 648評論 0 0