0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

開山師傅 ? 來源:嵌入式應(yīng)用開發(fā) ? 作者:嵌入式應(yīng)用開發(fā) ? 2022-06-01 11:31 ? 次閱讀

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

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

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

以發(fā)生的方式來分類,內(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)境或操作過程下才會(huì)發(fā)生。常發(fā)性和偶發(fā)性是相對(duì)的。對(duì)于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測試環(huán)境和測試方法對(duì)檢測內(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ù)中卻沒有釋放該內(nèi)存,所以內(nèi)存泄漏只會(huì)發(fā)生一次。

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

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

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

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

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

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

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

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

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

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

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

內(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ù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個(gè)問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對(duì)于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。

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

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

4.檢查List、MAP等集合對(duì)象是否有使用完后,未清除的問題。List、MAP等集合對(duì)象會(huì)始終存有對(duì)對(duì)象的引用,使得這些對(duì)象不能被GC回收。

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

推薦幾款檢查內(nèi)存泄露的軟件:

pYYBAGKW3WuAT_TIAAEBk7uB5uY506.png

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67770
  • 內(nèi)存泄漏
    +關(guān)注

    關(guān)注

    0

    文章

    39

    瀏覽量

    9187
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    內(nèi)存故障及解決方法

    內(nèi)存故障及解決方法(一)按下電源開關(guān)后電腦不啟動(dòng)、黑屏故障的解決   電腦開機(jī)后就要自檢內(nèi)存,但是此時(shí)因?yàn)橐韵聨讉€(gè)方面的原因,就可能造成開機(jī)無顯示的故障?! ?、
    發(fā)表于 06-16 13:16

    STM32堆棧溢出會(huì)出現(xiàn)的問題及溢出原因分析和解決方法

    `在開發(fā)過程中,我們有時(shí)候可能會(huì)遇到數(shù)據(jù)錯(cuò)誤的情況,而這個(gè)情況發(fā)生多數(shù)是由于堆棧溢出導(dǎo)致,這里我們將詳細(xì)講解復(fù)現(xiàn)堆棧溢出會(huì)導(dǎo)致的問題及提供相應(yīng)的解決方法。1 .建立一個(gè)測試工程定義主函數(shù)定義堆棧地址
    發(fā)表于 12-09 10:00

    java內(nèi)存溢出排查方法解析

     內(nèi)存溢出(out of memory),通俗理解就是內(nèi)存不夠,通常在運(yùn)行大型軟件或游戲時(shí),軟件或游戲所需要的內(nèi)存遠(yuǎn)遠(yuǎn)超出了你主機(jī)內(nèi)安裝的內(nèi)存
    發(fā)表于 11-28 13:57 ?6682次閱讀

    加濕器不噴霧的原因解決方法

    在使用加濕器的過程中發(fā)現(xiàn)不噴霧或噴霧小了是什么原因呢?有什么解決方法
    的頭像 發(fā)表于 04-04 16:09 ?2.8w次閱讀

    內(nèi)存溢出內(nèi)存泄露的區(qū)別_內(nèi)存溢出原因以及解決方法

    內(nèi)存溢出內(nèi)存泄露的區(qū)別是什么?內(nèi)存溢出怎么解決?內(nèi)存溢出
    發(fā)表于 06-01 10:27 ?2831次閱讀

    舵機(jī)常見的故障原因分析以及解決方法

    舵機(jī)的分析方法和注意事項(xiàng),以及對(duì)舵機(jī)常見故障的解決方法進(jìn)行一個(gè)列舉。
    的頭像 發(fā)表于 09-22 10:14 ?3510次閱讀
    舵機(jī)常見的故障<b class='flag-5'>原因</b>分析<b class='flag-5'>以及</b><b class='flag-5'>解決方法</b>

    如何解決內(nèi)存溢出

    ,有時(shí)候會(huì)自動(dòng)關(guān)閉軟件,重啟電腦或者軟件后釋放掉一部分內(nèi)存又可以正常運(yùn)行該軟件,而由系統(tǒng)配置、數(shù)據(jù)流、用戶代碼等原因而導(dǎo)致的內(nèi)存溢出錯(cuò)誤,即使用戶重新執(zhí)行任務(wù)依然無法避免 其實(shí)很簡單,
    的頭像 發(fā)表于 09-25 10:54 ?1261次閱讀
    如何解決<b class='flag-5'>內(nèi)存</b><b class='flag-5'>溢出</b>

    電感嘯叫的常見原因以及解決方法

    電子發(fā)燒友網(wǎng)站提供《電感嘯叫的常見原因以及解決方法.docx》資料免費(fèi)下載
    發(fā)表于 10-15 11:03 ?2次下載

    變頻器過熱的故障原因解決方法

    變頻器過熱的故障原因解決方法
    的頭像 發(fā)表于 10-24 10:09 ?4776次閱讀

    java內(nèi)存溢出的幾種原因和解決辦法

    內(nèi)存,但是如果程序中存在內(nèi)存泄漏(Memory Leak)或者使用不當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)等問題,仍然有可能導(dǎo)致內(nèi)存溢出。下面將詳細(xì)介紹Java內(nèi)存
    的頭像 發(fā)表于 11-23 14:44 ?5207次閱讀

    java內(nèi)存溢出排查方法

    Java內(nèi)存溢出(Memory overflow)是指Java虛擬機(jī)(JVM)中的堆內(nèi)存無法滿足對(duì)象分配的需求,導(dǎo)致程序拋出OutOfMemoryError異常。內(nèi)存
    的頭像 發(fā)表于 11-23 14:46 ?2390次閱讀

    jvm內(nèi)存溢出故障排查

    溢出故障排查的方法和步驟。 確認(rèn)內(nèi)存溢出錯(cuò)誤 首先,我們需要確認(rèn)應(yīng)用程序是否確實(shí)發(fā)生了內(nèi)存溢出錯(cuò)
    的頭像 發(fā)表于 12-05 11:04 ?649次閱讀

    jvm內(nèi)存溢出該如何定位解決

    在Java應(yīng)用程序中,JVM(Java虛擬機(jī))內(nèi)存溢出是指Java應(yīng)用程序試圖分配的內(nèi)存超過了JVM所允許的最大內(nèi)存大小,導(dǎo)致程序無法正常執(zhí)行。內(nèi)存
    的頭像 發(fā)表于 12-05 11:05 ?1133次閱讀

    內(nèi)存溢出內(nèi)存泄漏:定義、區(qū)別與解決方案

    內(nèi)存溢出內(nèi)存泄漏:定義、區(qū)別與解決方案? 內(nèi)存溢出內(nèi)存泄漏是計(jì)算機(jī)科學(xué)中常見的問題,在開發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?1823次閱讀

    PCB焊盤脫落的原因解決方法

    PCB焊盤脫落的原因解決方法? PCB(印刷電路板)焊盤的脫落是一個(gè)常見的問題,它會(huì)導(dǎo)致電子設(shè)備無法正常工作。本文將詳細(xì)介紹焊盤脫落的原因以及解決
    的頭像 發(fā)表于 01-18 11:21 ?4759次閱讀