21年第41周:什么是內(nèi)存泄露??jī)?nèi)存溢出旁钧?

內(nèi)存泄漏遇到過(guò)沒(méi)吸重?什么原因?qū)е碌模吭趺唇鉀Q歪今?

那么內(nèi)存溢出呢嚎幸,是什么情況?本文帶你理解寄猩。

內(nèi)存溢出 out of memory嫉晶,是指程序在申請(qǐng)內(nèi)存時(shí),沒(méi)有足夠的內(nèi)存空間供其使用田篇,出現(xiàn)out of memory替废;比如申請(qǐng)了一個(gè)integer,但給它存了long才能存下的數(shù),那就是內(nèi)存溢出斯辰。

內(nèi)存溢出就是你要求分配的內(nèi)存超出了系統(tǒng)能給你的舶担,系統(tǒng)不能滿足需求,于是產(chǎn)生溢出彬呻。

內(nèi)存泄漏 Memory Leak 是指你向系統(tǒng)申請(qǐng)分配內(nèi)存進(jìn)行使用(new)衣陶,可是使用完了以后卻不歸還(delete),結(jié)果你申請(qǐng)到的那塊內(nèi)存你自己也不能再訪問(wèn)(也許你把它的地址給弄丟了)闸氮,而系統(tǒng)也不能再次將它分配給需要的程序剪况。一個(gè)盤子用盡各種方法只能裝4個(gè)果子,你裝了5個(gè)蒲跨,結(jié)果掉倒地上不能吃了译断。這就是溢出!比方說(shuō)棧或悲,棧滿時(shí)再做進(jìn)棧必定產(chǎn)生空間溢出孙咪,叫上溢,椦灿铮空時(shí)再做退棧也產(chǎn)生空間溢出翎蹈,稱為下溢。就是分配的內(nèi)存不足以放下數(shù)據(jù)項(xiàng)序列,稱為內(nèi)存溢出.

以發(fā)生的方式來(lái)分類男公,內(nèi)存泄漏可以分為4類:

1. 常發(fā)性內(nèi)存泄漏 發(fā)生內(nèi)存泄漏的代碼會(huì)被多次執(zhí)行到荤堪,每次被執(zhí)行的時(shí)候都會(huì)導(dǎo)致一塊內(nèi)存泄漏。

2. 偶發(fā)性內(nèi)存泄漏 發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過(guò)程下才會(huì)發(fā)生。常發(fā)性和偶發(fā)性是相對(duì)的澄阳。對(duì)于特定的環(huán)境拥知,偶發(fā)性的也許就變成了常發(fā)性的。所以測(cè)試環(huán)境和測(cè)試方法對(duì)檢測(cè)內(nèi)存泄漏至關(guān)重要碎赢。

3. 一次性內(nèi)存泄漏 發(fā)生內(nèi)存泄漏的代碼只會(huì)被執(zhí)行一次低剔,或者由于算法上的缺陷,導(dǎo)致總會(huì)有一塊僅且一塊內(nèi)存發(fā)生泄漏揩抡。比如户侥,在類的構(gòu)造函數(shù)中分配內(nèi)存,在析構(gòu)函數(shù)中卻沒(méi)有釋放該內(nèi)存峦嗤,所以內(nèi)存泄漏只會(huì)發(fā)生一次蕊唐。

4. 隱式內(nèi)存泄漏 程序在運(yùn)行過(guò)程中 不停的分配內(nèi)存,但是直到結(jié)束的時(shí)候才釋放內(nèi)存烁设。嚴(yán)格的說(shuō)這里并沒(méi)有發(fā)生內(nèi)存泄漏替梨,因?yàn)樽罱K程序釋放了所有申請(qǐng)的內(nèi)存。但是對(duì)于一個(gè)服務(wù)器程序装黑,需要運(yùn)行幾天副瀑,幾周甚至幾個(gè)月,不及時(shí)釋放內(nèi)存也可能導(dǎo)致最終耗盡系統(tǒng)的所有內(nèi)存恋谭。所以糠睡,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏。

從用戶使用程序的角度來(lái)看疚颊,內(nèi)存泄漏本身不會(huì)產(chǎn)生什么危害狈孔,作為一般的用戶,根本感覺(jué)不到內(nèi)存泄漏的存在材义。真正有危害的是內(nèi)存泄漏的堆積均抽,這會(huì)最終消耗盡系統(tǒng)所有的內(nèi)存。從這個(gè)角度來(lái)說(shuō)其掂,一次性內(nèi)存泄漏并沒(méi)有什么危害油挥,因?yàn)樗粫?huì)堆積,而隱式內(nèi)存泄漏危害性則非常大款熬,因?yàn)檩^之于常發(fā)性和偶發(fā)性內(nèi)存泄漏它更難被檢測(cè)到

內(nèi)存泄露 memory leak深寥,是指程序在申請(qǐng)內(nèi)存后,無(wú)法釋放已申請(qǐng)的內(nèi)存空間贤牛,一次內(nèi)存泄露危害可以忽略翩迈,但內(nèi)存泄露堆積后果很嚴(yán)重,無(wú)論多少內(nèi)存,遲早會(huì)被占光盔夜。

memory leak會(huì)最終會(huì)導(dǎo)致out of memory!

內(nèi)存溢出的原因以及解決方法

引起內(nèi)存溢出的原因有很多種,小編列舉一下常見(jiàn)的有以下幾種:

1.內(nèi)存中加載的數(shù)據(jù)量過(guò)于龐大喂链,如一次從數(shù)據(jù)庫(kù)取出過(guò)多數(shù)據(jù)返十;

2.集合類中有對(duì)對(duì)象的引用,使用完后未清空椭微,使得JVM不能回收洞坑;

3.代碼中存在死循環(huán)或循環(huán)產(chǎn)生過(guò)多重復(fù)的對(duì)象實(shí)體;

4.使用的第三方軟件中的BUG蝇率;

5.啟動(dòng)參數(shù)內(nèi)存值設(shè)定的過(guò)小

內(nèi)存溢出的解決方案

第一步迟杂,修改JVM啟動(dòng)參數(shù),直接增加內(nèi)存本慕。(-Xms排拷,-Xmx參數(shù)一定不要忘記加。)

第二步锅尘,檢查錯(cuò)誤日志监氢,查看“OutOfMemory”錯(cuò)誤前是否有其它異常或錯(cuò)誤藤违。

第三步浪腐,對(duì)代碼進(jìn)行走查和分析,找出可能發(fā)生內(nèi)存溢出的位置顿乒。

重點(diǎn)排查以下幾點(diǎn):

1.檢查對(duì)數(shù)據(jù)庫(kù)查詢中议街,是否有一次獲得全部數(shù)據(jù)的查詢。一般來(lái)說(shuō)璧榄,如果一次取十萬(wàn)條記錄到內(nèi)存特漩,就可能引起內(nèi)存溢出。這個(gè)問(wèn)題比較隱蔽犹菱,在上線前拾稳,數(shù)據(jù)庫(kù)中數(shù)據(jù)較少,不容易出問(wèn)題腊脱,上線后访得,數(shù)據(jù)庫(kù)中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出陕凹。因此對(duì)于數(shù)據(jù)庫(kù)查詢盡量采用分頁(yè)的方式查詢悍抑。

2.檢查代碼中是否有死循環(huán)或遞歸調(diào)用。

3.檢查是否有大循環(huán)重復(fù)產(chǎn)生新對(duì)象實(shí)體杜耙。

4.檢查對(duì)數(shù)據(jù)庫(kù)查詢中搜骡,是否有一次獲得全部數(shù)據(jù)的查詢。一般來(lái)說(shuō)佑女,如果一次取十萬(wàn)條記錄到內(nèi)存记靡,就可能引起內(nèi)存溢出谈竿。這個(gè)問(wèn)題比較隱蔽,在上線前摸吠,數(shù)據(jù)庫(kù)中數(shù)據(jù)較少空凸,不容易出問(wèn)題,上線后寸痢,數(shù)據(jù)庫(kù)中數(shù)據(jù)多了呀洲,一次查詢就有可能引起內(nèi)存溢出。因此對(duì)于數(shù)據(jù)庫(kù)查詢盡量采用分頁(yè)的方式查詢啼止。

5.檢查L(zhǎng)ist道逗、MAP等集合對(duì)象是否有使用完后,未清除的問(wèn)題献烦。List滓窍、MAP等集合對(duì)象會(huì)始終存有對(duì)對(duì)象的引用,使得這些對(duì)象不能被GC回收仿荆。

第四步贰您,使用內(nèi)存查看工具動(dòng)態(tài)查看內(nèi)存使用情況

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拢操,隨后出現(xiàn)的幾起案子锦亦,更是在濱河造成了極大的恐慌,老刑警劉巖令境,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杠园,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡舔庶,警方通過(guò)查閱死者的電腦和手機(jī)抛蚁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)惕橙,“玉大人瞧甩,你說(shuō)我怎么就攤上這事∶逐校” “怎么了肚逸?”我有些...
    開(kāi)封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)彬坏。 經(jīng)常有香客問(wèn)我朦促,道長(zhǎng),這世上最難降的妖魔是什么栓始? 我笑而不...
    開(kāi)封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任务冕,我火速辦了婚禮,結(jié)果婚禮上幻赚,老公的妹妹穿的比我還像新娘禀忆。我一直安慰自己臊旭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布油湖。 她就那樣靜靜地躺著巍扛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乏德。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天吠昭,我揣著相機(jī)與錄音喊括,去河邊找鬼。 笑死矢棚,一個(gè)胖子當(dāng)著我的面吹牛郑什,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒲肋,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蘑拯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了兜粘?” 一聲冷哼從身側(cè)響起申窘,我...
    開(kāi)封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孔轴,沒(méi)想到半個(gè)月后剃法,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡路鹰,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年贷洲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晋柱。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡优构,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出雁竞,到底是詐尸還是另有隱情钦椭,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布浓领,位于F島的核電站玉凯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏联贩。R本人自食惡果不足惜漫仆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泪幌。 院中可真熱鬧盲厌,春花似錦署照、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至懂扼,卻和暖如春禁荸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阀湿。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工赶熟, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陷嘴。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓映砖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灾挨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邑退,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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