Android面試一天一題(Day 28:內(nèi)存泥潭(上))

面試的時候涂籽,有些問題并不是每個程序員都解決過,沒解決過這類問題并不代表這個程序員不合適這個工作砸抛。但解決過并有一定經(jīng)驗的話评雌,卻能客觀地反應(yīng)出面試者某一方面的能力。如內(nèi)存問題直焙,很多應(yīng)用都或多或少有這個問題(內(nèi)存泄露)景东,但如果沒有到OOM的程度,很多這方面的問題都不會被解決奔誓。

因為有GC的存在斤吐,很多人都不需要去管理內(nèi)存,一般OOM很容易從LOG發(fā)現(xiàn)問題根源厨喂,而且現(xiàn)今的手機(jī)內(nèi)存都增大了很多和措,OOM的現(xiàn)像也比較少見了。所以蜕煌,很多時候我們面試時派阱,對于一般經(jīng)驗的開發(fā),也不會問他們這方面的問題斜纪,因為他實際中可能基本上沒有“遇到”過這樣的問題贫母。

但對于資深的開發(fā)來說,內(nèi)存問題卻又是必問的問題盒刚,因為在公司里往往受信任的開發(fā)才會被安排去解決內(nèi)存問題腺劣。今天就來說說這道一般人咱不問他的面試題。

面試題:如何檢測內(nèi)存泄露因块,如何進(jìn)行內(nèi)存優(yōu)化橘原?

所謂“知己知彼,百戰(zhàn)不殆”,我們要解決內(nèi)存問題前靠柑,至少應(yīng)該先了解一下內(nèi)存是什么寨辩。說到內(nèi)存有兩個概念要先搞清楚:RAM和ROM。手機(jī)的RAM即我們常說的內(nèi)存歼冰,是Random Access Memory的縮寫靡狞,即隨機(jī)存儲器,在工作狀態(tài)時可以隨機(jī)讀寫數(shù)據(jù)隔嫡,斷電以后會丟失數(shù)據(jù)甸怕。手機(jī)的ROM和傳統(tǒng)的ROM(Read Only Memory)又有些不一樣,手機(jī)上的ROM在一定條件下是可寫的腮恩,用戶層級的寫入被限制(所以有些用應(yīng)需要ROOT權(quán)限)梢杭。它分為兩部分,一部分是供系統(tǒng)使用(/System和/Cache)秸滴,另外一部分是用作用戶存儲數(shù)據(jù)(/data)武契,用戶安裝的應(yīng)用就在這個data空間中。

Android 2.0后的系統(tǒng)可以把APK應(yīng)用安裝在SD卡上荡含,但4.0后又取消了這個做法咒唆,不允許安裝在SD卡上,而且隨著手機(jī)內(nèi)部存儲容量的擴(kuò)大释液,很多手機(jī)都不支持外插一個TF卡了全释。

我們?yōu)槭裁葱枰獌?nèi)存?

先來復(fù)習(xí)一個操作系統(tǒng)的知識误债,CPU執(zhí)行運算時需要從內(nèi)存(RAM)獲取操作數(shù)據(jù)浸船,對于多任務(wù)系統(tǒng)來說同時有多個進(jìn)程在運行,不可能給每個進(jìn)程都分配置大量的內(nèi)存寝蹈,因為RAM容量(即物理內(nèi)存的容量)始終是有限的李命。“解決不了的問題箫老,可以通過增加中間層來解決”封字,前人們通過給進(jìn)程增加一個虛擬內(nèi)存,讓每個進(jìn)程都有獨立的虛擬內(nèi)存空間槽惫,由系統(tǒng)來管理虛擬內(nèi)存到物理內(nèi)存的映射周叮,保證各個進(jìn)程的數(shù)據(jù)不會錯亂辩撑。

在32位的系統(tǒng)中界斜,內(nèi)存的尋址空間是2的32次方,即4GB合冀。

從上圖也可以明白各薇,你的應(yīng)用中的對象所能所使用的內(nèi)存在理論上也不能操過Heap區(qū)域的大小。

Android系統(tǒng)是基于Linux的,但Android中的進(jìn)程分為兩種峭判,一種是Native進(jìn)程开缎,一種是Java進(jìn)程。我們常接觸的APK應(yīng)用都是運行在Java進(jìn)程中的林螃。Android應(yīng)用運行于Dalvik虛擬機(jī)之上的進(jìn)程奕删,由Dalvik虛擬機(jī)負(fù)責(zé)分配和管理應(yīng)用的Java對象需要的內(nèi)存。而對應(yīng)到內(nèi)存上疗认,就存在Natvie內(nèi)存和Java內(nèi)存完残,由Dalvik虛擬機(jī)管理的就是Java內(nèi)存(或者叫Java Heap內(nèi)存)。

Native進(jìn)程:采用C/C++實現(xiàn)横漏,不包含Dalvik實例的進(jìn)程谨设,/system/bin/目錄下面的程序文件運行后都是以native 進(jìn)程形式存在的,/system/bin/surfaceflinger缎浇、/system/bin/rild扎拣、procrank等就是Native進(jìn)程。

一般我們常遇到的內(nèi)存問題素跺,基本上都集中在Java內(nèi)存二蓝。一些游戲或視頻之類的應(yīng)用,有可能會更多的面對Native的內(nèi)存問題亡笑。

雖然有些手機(jī)的RAM很大(如小米5S有4G RAM)侣夷,但Android系統(tǒng)為了能同時讓比較多的進(jìn)程常駐內(nèi)存(這樣程序啟動時就不用每次都重新加載到內(nèi)存,從而加快切換應(yīng)用的速度)仑乌,它們給每一個應(yīng)用進(jìn)程都分配了一個有限制的較小的heapsize百拓,當(dāng)Java申請的堆內(nèi)存空間超過閾值時,就會拋出OOM異常晰甚。也就是說衙传,程序發(fā)生OMM并不表示RAM不足,而是因為程序申請的Java Heap對象超過了Dalvik虛擬機(jī)設(shè)直heapgrowthlimit厕九。

目前主流的一些機(jī)型這個值都有190M上下蓖捶,想想幾年前只有16到32M,是不是很幸福?

正如我們在“圖片到底是什么”那個面試題中也有說過扁远,Bitmap圖片可以放在Java堆內(nèi)存中俊鱼,也有些情況可以放在Native內(nèi)存中來獲得更大的內(nèi)存,避免OOM畅买。因為APK應(yīng)用的Java進(jìn)程也是運行在Native進(jìn)程之上的并闲,而Native的內(nèi)存空間是不受Dalvik虛擬機(jī)的heapsize限制,相對而言大很多(Java和Native可以通過JNI進(jìn)行通信)谷羞。

了解了這些基礎(chǔ)知識后帝火,在面試進(jìn),你可能會遇到這樣的問題:“如果一個項目的代碼量很大,通過代碼直接分析內(nèi)存問題不太現(xiàn)實時犀填,你有什么手段或者工具去發(fā)現(xiàn)這個項目中是否存在內(nèi)存問題蠢壹?并說一下解決的辦法或者相關(guān)的案例。對于初級的開發(fā)九巡,你對他們有什么建議能讓他們避免內(nèi)存問題嗎图贸?”

未完待續(xù)。冕广。求妹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佳窑,隨后出現(xiàn)的幾起案子制恍,更是在濱河造成了極大的恐慌,老刑警劉巖神凑,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净神,死亡現(xiàn)場離奇詭異,居然都是意外死亡溉委,警方通過查閱死者的電腦和手機(jī)鹃唯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓣喊,“玉大人坡慌,你說我怎么就攤上這事≡迦” “怎么了洪橘?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長棵帽。 經(jīng)常有香客問我熄求,道長,這世上最難降的妖魔是什么逗概? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任弟晚,我火速辦了婚禮,結(jié)果婚禮上逾苫,老公的妹妹穿的比我還像新娘卿城。我一直安慰自己,他們只是感情好铅搓,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布瑟押。 她就那樣靜靜地躺著,像睡著了一般狸吞。 火紅的嫁衣襯著肌膚如雪勉耀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天蹋偏,我揣著相機(jī)與錄音便斥,去河邊找鬼。 笑死威始,一個胖子當(dāng)著我的面吹牛枢纠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播黎棠,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼晋渺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脓斩?” 一聲冷哼從身側(cè)響起木西,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎随静,沒想到半個月后八千,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡燎猛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年恋捆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片重绷。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡沸停,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出昭卓,到底是詐尸還是另有隱情愤钾,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布候醒,位于F島的核電站绰垂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏火焰。R本人自食惡果不足惜劲装,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望昌简。 院中可真熱鬧占业,春花似錦、人聲如沸纯赎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽犬金。三九已至念恍,卻和暖如春六剥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峰伙。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工疗疟, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瞳氓。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓策彤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匣摘。 傳聞我的和親對象是個殘疾皇子店诗,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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