自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

對待棘手bug,新手與大牛的差距在哪里?

移動開發(fā) Android 開發(fā)工具
自上上周起,團(tuán)隊中陸續(xù)有iOS開發(fā)抱怨電腦特別卡。有細(xì)心的同學(xué)發(fā)現(xiàn),因為Xcode占用了約6-7G內(nèi)存,而部分mac只有8G內(nèi)存,所以內(nèi)存爆滿引起卡頓。

[[204255]]

問題描述:

  • 自上上周起,團(tuán)隊中陸續(xù)有iOS開發(fā)抱怨電腦特別卡。有細(xì)心的同學(xué)發(fā)現(xiàn),因為Xcode占用了約6-7G內(nèi)存,而部分mac只有8G內(nèi)存,所以內(nèi)存爆滿引起卡頓。
  • 而部分同學(xué)的mac是16G內(nèi)存的,比如我(嘲諷臉),因為內(nèi)存充足沒感覺到卡。
  • 但這個問題影響團(tuán)隊的開發(fā)效率,所以需要去解決問題。

內(nèi)存對比:

在沐浴更衣焚香、殺進(jìn)程、清緩存后,分別拉取相鄰的812版本代碼和816版本代碼分別編譯,得到結(jié)論:

  • 812調(diào)試時,占用2G內(nèi)存
  • 816調(diào)試時,占用6.8G內(nèi)存

吐槽:

  • 對于這個數(shù)據(jù),我們內(nèi)心是拒絕接受的。有如下2點吐槽:
  1. 如果代碼亂申請內(nèi)存,那么內(nèi)存爆掉的應(yīng)該是模擬器或真機(jī)。而不該是Xcode
  2. 如果當(dāng)前版本新增10w行代碼(其實不到),對總代碼量增長不超10%,Xcode內(nèi)存怎么可能翻兩翻。
  • 所以我們覺得,這一定是蘋果的鍋,我們不背

但是不管是誰的鍋,肯定是代碼或者配置觸發(fā)的,分析還要繼續(xù)。

分析方法選擇:

  • 擺在我們面前有2個分析方法:
  1. 找代碼:通過二分法,編譯不同日期的版本,找到引發(fā)問題的那次提交,確定是哪個改動引起
  2. 找內(nèi)存:分析增大的內(nèi)存是什么,根據(jù)增大的內(nèi)容分析問題出在哪。
  • 如果使用方法1,編譯一次代碼需要15分鐘,假設(shè)問題是某一行代碼引起的,估計需要找一天。如果是某多行代碼組合影響的問題,時間會更長。而且就算找到代碼,也未必知道原理是什么。
  • 所以我選擇**方法2**,不行再退到方法1

分析步驟:

我在run的時候發(fā)現(xiàn):

  • 812初次打開代碼內(nèi)存1G以內(nèi),編譯運行時內(nèi)存2G,關(guān)閉Xcode后再打開內(nèi)存2G
  • 816初次打開代碼內(nèi)存1G以內(nèi),編譯運行時內(nèi)存6G,關(guān)閉Xcode后再打開內(nèi)存6G

關(guān)閉Xcode后再打開,此時Xcode并沒有run,所以推測他在做一件事:讀緩存

緩存文件: 

  • 大家都知道,Xcode編譯一個新工程會很慢,但是第二次編譯就很快。那是因為他把編譯結(jié)果存到了緩存文件中。第二次編譯只讀文件不編譯自然就快了。
  • 緩存文件存儲在“/Users/你的用戶名/Library/Developer/Xcode/DerivedData”目錄下
  • 812和816版本的緩存文件對比如下:

  • 初步可以看出,緩存文件數(shù)量一致,但是大小差距很大。所以下一步就是來找茬:到底誰變大了
  • 經(jīng)過一番尋找,發(fā)現(xiàn)每個類會生成三個文件:

.o文件:二進(jìn)制對象文件,不多說

.d文件:文本文件,記錄該類依賴的所有文件路徑

.dia文件:未知二進(jìn)制文件,但是變大的就是它

  • dia是有一部分變大了,一部分沒變。嘗試用二進(jìn)制工具打開讀了一下,有驚喜:

  • 這不就是warning嘛

我的吐槽又來了:

  • 是誰!站出來!**寫了4個G的warning!**

繼續(xù)分析:

那具體是什么導(dǎo)致的warning呢,面對幾千個.dia文件,我內(nèi)心是崩潰的。

  • 幸好找基友溝通,剛好他做了代碼warning掃描,發(fā)現(xiàn)816比812只是某組代碼多了107個warning,其他組沒變化,而且是nonnull相關(guān)warning,并不重要所以沒追究。
  • 我們找到107處warning的代碼,查看提交記錄,就是在大家反饋卡頓之前。貌似就是它了。我們把warning解了,clean重新編譯,問題得解。

問題雖解,但是遺留2個問題:

  1. 怎么就提交了107個warning?
  2. 區(qū)區(qū)107個warning。為啥會導(dǎo)致內(nèi)存飆升?我們還剩幾百個warning為啥沒問題?

問題1:

  • 引發(fā)107個warning的只有一行代碼
  • 對于nonnull相關(guān)warning蘋果的潛規(guī)則是這樣的:

自Xcode6起提供的新功能,可以申明一個函數(shù)的參數(shù)是必傳的(nonnull)還是可選的(nullable) ,這會讓代碼更嚴(yán)謹(jǐn),我們是推薦使用的

兼容老代碼:整個頭文件都沒有nonnull/nullable申明的,編譯沒毛病

對新代碼高要求:只要給代碼中添加了一個nonnull/nullable,剩余的代碼也必須添加,否則其他每個接口就會有warning

  • 所以,這次涉案的代碼是個舊工具類,有107個函數(shù)。新增的一行代碼添加了nonnull。于是產(chǎn)生了107個warning

問題2:

舉個例子,有A B C三個類

  • A.h有一個warning,其.dia文件中會如下信息:

insert '_Nullable' if the pointer may be null

insert '_Nonnull' if the pointer should never be null

  1. A.m文件絕對路徑
  2. A.h文件絕對路徑
  3. A.m文件第幾行引用了A.h,存在warning
  4. warning在A.h的位置
  5. warning描述是:pointer is missing a nullability type specifier (_Nonnull, _Nullable, or _Null_unspecified)
  6. fix的兩種方法:
  • 總之,一處warning的信息大約是1k
  • 如果B引用了A,則B的.dia文件包含如上所有信息,以及多個B的文件路徑,即B的描述信息超過A
  • 如果C引用了B,而B在頭文件中引用了A,則C的描述信息超過B

所以

  • 在工程上,107warning的文件,dia約130k。
  • 所有直接間接引用的文件數(shù)量大概2500,單個文件都超過130k。文件大小約350M。
  • 加上模擬器有2個cpu架構(gòu)(i386/x86_64),會生成2份文件,緩存中還有個聚合的dgph文件。以及文件在內(nèi)存中結(jié)構(gòu)化后占用的內(nèi)存空間。
  • 所以最終翻了幾倍,達(dá)到4G的內(nèi)存占用是可以理解的。

結(jié)論:

  • 不要忽略warning,特別是頭文件中的warning,會被多處引用導(dǎo)致過大的描述信息
  • 頭文件中盡量不要import頭文件,會造成過度的引用,放大問題。

后續(xù):

  • 818版本已經(jīng)fix了core中的所有nonnull問題。后續(xù)逐步將warning清零
  • fix后內(nèi)存占用如圖

PS:這是蘋果的bug么?我覺得還是自己挖坑把自己埋了。

【本文為51CTO專欄作者“阿里巴巴官方技術(shù)”原創(chuàng)稿件,轉(zhuǎn)載請聯(lián)系原作者】

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2010-08-27 07:54:06

開發(fā)高手

2012-05-18 09:34:19

程序員

2021-01-23 23:27:13

人工智能深度學(xué)習(xí)數(shù)據(jù)

2012-05-10 13:31:48

程序員開發(fā)者

2015-04-08 15:38:17

程序員程序員差距

2022-02-24 17:32:38

程序員互聯(lián)網(wǎng)公司離職率

2020-05-27 11:29:29

GDPR數(shù)據(jù)安全數(shù)據(jù)泄露

2015-10-09 09:11:39

html5原生App區(qū)別

2017-12-25 10:16:32

程序員Python常用工具

2020-09-24 09:53:48

WebhooksAPI數(shù)據(jù)

2009-06-23 09:07:38

2018-07-17 10:50:09

2022-07-01 21:13:46

NFT加密SuperRare

2021-02-01 10:46:32

多云云安全云計算

2018-11-26 15:04:49

SDN網(wǎng)絡(luò)數(shù)據(jù)中心

2010-08-09 09:09:36

Linux與BSD的區(qū)

2023-07-07 15:11:51

智慧城市智能電網(wǎng)

2010-12-14 15:40:36

Web設(shè)計師

2010-11-17 09:07:39

2012-01-01 19:25:02

點贊
收藏

51CTO技術(shù)棧公眾號