內(nèi)存泄露是怎么回事洒敏?

對(duì)普通進(jìn)程來(lái)說(shuō),能看到的其實(shí)是內(nèi)核提供的虛擬內(nèi)存疙驾,這些虛擬內(nèi)存還需要通過(guò)頁(yè)表凶伙,由系統(tǒng)映射為物理內(nèi)存。

當(dāng)進(jìn)程通過(guò) malloc() 申請(qǐng)?zhí)摂M內(nèi)存后它碎,系統(tǒng)并不會(huì)立即為其分配物理內(nèi)存函荣,而是在首次訪(fǎng)問(wèn)時(shí),才通過(guò)缺頁(yè)異常陷入內(nèi)核中分配內(nèi)存扳肛。

為了協(xié)調(diào) CPU 與磁盤(pán)間的性能差異傻挂,Linux 還會(huì)使用 Cache 和 Buffer ,分別把文件和磁盤(pán)讀寫(xiě)的數(shù)據(jù)緩存到內(nèi)存中挖息。

對(duì)應(yīng)用程序來(lái)說(shuō)金拒,動(dòng)態(tài)內(nèi)存的分配和回收,是既核心又復(fù)雜的一個(gè)邏輯功能模塊套腹。管理內(nèi)存的過(guò)程中绪抛,也很容易發(fā)生各種各樣的“事故”,比如电禀,

沒(méi)正確回收分配后的內(nèi)存幢码,導(dǎo)致了泄漏。

訪(fǎng)問(wèn)的是已分配內(nèi)存邊界外的地址尖飞,導(dǎo)致程序異常退出症副,等等。

用戶(hù)空間內(nèi)存包括多個(gè)不同的內(nèi)存段政基,比如只讀段贞铣、數(shù)據(jù)段、堆沮明、棧以及文件映射段等咕娄。這些內(nèi)存段正是應(yīng)用程序使用內(nèi)存的基本方式。

舉個(gè)例子珊擂,你在程序中定義了一個(gè)局部變量圣勒,比如一個(gè)整數(shù)數(shù)組 int data[64] ,就定義了一個(gè)可以存儲(chǔ) 64 個(gè)整數(shù)的內(nèi)存段摧扇。由于這是一個(gè)局部變量圣贸,它會(huì)從內(nèi)存空間的棧中分配內(nèi)存。

棧內(nèi)存由系統(tǒng)自動(dòng)分配和管理扛稽。一旦程序運(yùn)行超出了這個(gè)局部變量的作用域吁峻,棧內(nèi)存就會(huì)被系統(tǒng)自動(dòng)回收,所以不會(huì)產(chǎn)生內(nèi)存泄漏的問(wèn)題在张。

再比如用含,很多時(shí)候,我們事先并不知道數(shù)據(jù)大小帮匾,所以你就要用到標(biāo)準(zhǔn)庫(kù)函數(shù) malloc() _啄骇,_ 在程序中動(dòng)態(tài)分配內(nèi)存。這時(shí)候瘟斜,系統(tǒng)就會(huì)從內(nèi)存空間的堆中分配內(nèi)存缸夹。

堆內(nèi)存由應(yīng)用程序自己來(lái)分配和管理。除非程序退出螺句,這些堆內(nèi)存并不會(huì)被系統(tǒng)自動(dòng)釋放虽惭,而是需要應(yīng)用程序明確調(diào)用庫(kù)函數(shù) free() 來(lái)釋放它們。如果應(yīng)用程序沒(méi)有正確釋放堆內(nèi)存蛇尚,就會(huì)造成內(nèi)存泄漏芽唇。

內(nèi)存泄漏的危害非常大,這些忘記釋放的內(nèi)存取劫,不僅應(yīng)用程序自己不能訪(fǎng)問(wèn)匆笤,系統(tǒng)也不能把它們?cè)俅畏峙浣o其他應(yīng)用。內(nèi)存泄漏不斷累積勇凭,甚至?xí)谋M系統(tǒng)內(nèi)存疚膊。

雖然,系統(tǒng)最終可以通過(guò) OOM (Out of Memory)機(jī)制殺死進(jìn)程虾标,但進(jìn)程在 OOM 前寓盗,可能已經(jīng)引發(fā)了一連串的反應(yīng),導(dǎo)致嚴(yán)重的性能問(wèn)題璧函。

比如傀蚌,其他需要內(nèi)存的進(jìn)程,可能無(wú)法分配新的內(nèi)存蘸吓;內(nèi)存不足善炫,又會(huì)觸發(fā)系統(tǒng)的緩存回收以及 SWAP 機(jī)制,從而進(jìn)一步導(dǎo)致 I/O 的性能問(wèn)題等等库继。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末箩艺,一起剝皮案震驚了整個(gè)濱河市窜醉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌艺谆,老刑警劉巖榨惰,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異静汤,居然都是意外死亡琅催,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)虫给,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)藤抡,“玉大人,你說(shuō)我怎么就攤上這事抹估〔颍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵棋蚌,是天一觀(guān)的道長(zhǎng)嫁佳。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谷暮,這世上最難降的妖魔是什么蒿往? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮湿弦,結(jié)果婚禮上瓤漏,老公的妹妹穿的比我還像新娘。我一直安慰自己颊埃,他們只是感情好蔬充,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著班利,像睡著了一般饥漫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罗标,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天庸队,我揣著相機(jī)與錄音,去河邊找鬼闯割。 笑死彻消,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宙拉。 我是一名探鬼主播宾尚,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼谢澈!你這毒婦竟也來(lái)了煌贴?” 一聲冷哼從身側(cè)響起御板,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崔步,沒(méi)想到半個(gè)月后稳吮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡井濒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了列林。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瑞你。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖希痴,靈堂內(nèi)的尸體忽然破棺而出者甲,到底是詐尸還是另有隱情,我是刑警寧澤砌创,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布栓撞,位于F島的核電站玛迄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜信柿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闲延。 院中可真熱鬧立磁,春花似錦、人聲如沸晃洒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)球及。三九已至氧骤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吃引,已是汗流浹背筹陵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留际歼,地道東北人惶翻。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像鹅心,于是被迫代替她去往敵國(guó)和親吕粗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,090評(píng)論 1 32
  • 1.內(nèi)存的頁(yè)面置換算法 (1)最佳置換算法(OPT)(理想置換算法):從主存中移出永遠(yuǎn)不再需要的頁(yè)面议泵;如無(wú)這樣的...
    杰倫哎呦哎呦閱讀 3,235評(píng)論 1 9
  • 1占贫、Linux內(nèi)存頁(yè)管理 Linux內(nèi)核管理物理內(nèi)存是通過(guò)分頁(yè)機(jī)制實(shí)現(xiàn)的,它將整個(gè)內(nèi)存劃分成4K大小頁(yè)先口,作為使分配...
    gbmaotai閱讀 1,406評(píng)論 0 2
  • 被文同時(shí)發(fā)布在CSDN上型奥,歡迎查看。 APP內(nèi)存的使用碉京,是評(píng)價(jià)一款應(yīng)用性能高低的一個(gè)重要指標(biāo)厢汹。雖然現(xiàn)在智能手機(jī)的內(nèi)...
    大圣代閱讀 4,807評(píng)論 2 54
  • 所有知識(shí)點(diǎn)已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)? 在 Jav...
    侯蛋蛋_閱讀 2,412評(píng)論 1 4