芒果视频下载

網站分(fen)類
登錄 |    

內存溢出的定義和原因 如何解決內存溢出問題

本文章由注冊用戶 溫暖·生活家 上傳提供 評論 發布 反饋 0
摘要:內存溢出通俗理解就是內存不夠,通常在運行大型軟件或游戲時,軟件或游戲所需要的內存遠遠超出了你主機內安裝的內存所承受大小,就叫內存溢出。此時軟件或游戲就運行不了,系統會提示內存溢出,有時候會自動關閉軟件,重啟電腦或者軟件后釋放掉一部分內存又可以正常運行該軟件。那么你知道內存溢出的原因嗎?應該如何解決內存溢出的問題呢?下面就和小編一起來看看詳細知識吧!

一、內存溢出的定義和原因

定義

內(nei)(nei)存(cun)(cun)(cun)溢(yi)出是(shi)(shi)(shi)指(zhi)應(ying)用(yong)(yong)系統中存(cun)(cun)(cun)在無法回(hui)收(shou)的(de)內(nei)(nei)存(cun)(cun)(cun)或(huo)使(shi)用(yong)(yong)的(de)內(nei)(nei)存(cun)(cun)(cun)過多,最(zui)終使(shi)得程(cheng)(cheng)(cheng)序(xu)(xu)運行要用(yong)(yong)到的(de)內(nei)(nei)存(cun)(cun)(cun)大(da)于(yu)虛擬機能提供的(de)最(zui)大(da)內(nei)(nei)存(cun)(cun)(cun)。為了解決Java中內(nei)(nei)存(cun)(cun)(cun)溢(yi)出問題(ti),我們首(shou)先必(bi)須了解Java是(shi)(shi)(shi)如(ru)何管理(li)內(nei)(nei)存(cun)(cun)(cun)的(de)。Java的(de)內(nei)(nei)存(cun)(cun)(cun)管理(li)就(jiu)是(shi)(shi)(shi)對象(xiang)(xiang)的(de)分配(pei)和(he)釋放(fang)問題(ti)。在Java中,內(nei)(nei)存(cun)(cun)(cun)的(de)分配(pei)是(shi)(shi)(shi)由(you)程(cheng)(cheng)(cheng)序(xu)(xu)完(wan)成(cheng)的(de),而內(nei)(nei)存(cun)(cun)(cun)的(de)釋放(fang)是(shi)(shi)(shi)由(you)垃(la)圾(ji)收(shou)集器(GarbageCollection,GC)完(wan)成(cheng)的(de),程(cheng)(cheng)(cheng)序(xu)(xu)員不需要通過調用(yong)(yong)GC函(han)數(shu)來釋放(fang)內(nei)(nei)存(cun)(cun)(cun),因(yin)為不同(tong)的(de)JVM實現者可能使(shi)用(yong)(yong)不同(tong)的(de)算法管理(li)GC,有(you)(you)的(de)是(shi)(shi)(shi)內(nei)(nei)存(cun)(cun)(cun)使(shi)用(yong)(yong)到達(da)一定程(cheng)(cheng)(cheng)度時(shi),GC才開始工作,也有(you)(you)定時(shi)執(zhi)行的(de),有(you)(you)的(de)是(shi)(shi)(shi)中斷式執(zhi)行GC。但GC只能回(hui)收(shou)無用(yong)(yong)并且(qie)不再被其它對象(xiang)(xiang)引(yin)用(yong)(yong)的(de)那些對象(xiang)(xiang)所占用(yong)(yong)的(de)空(kong)間。Java的(de)內(nei)(nei)存(cun)(cun)(cun)垃(la)圾(ji)回(hui)收(shou)機制(zhi)是(shi)(shi)(shi)從(cong)程(cheng)(cheng)(cheng)序(xu)(xu)的(de)主(zhu)要運行對象(xiang)(xiang)開始檢查引(yin)用(yong)(yong)鏈(lian),當(dang)遍(bian)歷(li)一遍(bian)后發現沒有(you)(you)被引(yin)用(yong)(yong)的(de)孤(gu)立對象(xiang)(xiang)就(jiu)作為垃(la)圾(ji)回(hui)收(shou)。

該圖片由注冊用戶"溫暖·生活家"提供,版權聲明反饋

原因

1、內存(cun)中加(jia)載(zai)的數(shu)據(ju)量過于龐(pang)大,如(ru)一次從數(shu)據(ju)庫取出過多數(shu)據(ju)。

2、集(ji)合類中有對對象(xiang)的引用(yong),使(shi)用(yong)完后未清空(kong),使(shi)得(de)JVM不能回收(shou)。

3、代碼中(zhong)存(cun)在死(si)循(xun)環或循(xun)環產生過多重復的對象實體。

4、使用(yong)的(de)第三方軟件(jian)中的(de)BUG。

5、啟動參數(shu)設定(ding)的過小(xiao)。

二、內存溢出的解決問題

第(di)一(yi)步,就是修改JVM啟動參數(shu),直接增加內存(cun)。這一(yi)點看上去似乎很簡單(dan),但很容易被忽略。JVM默認(ren)可以使用(yong)的(de)內存(cun)為(wei)64M,Tomcat默認(ren)可以使用(yong)的(de)內存(cun)為(wei)128MB,對于稍(shao)復雜(za)一(yi)點的(de)系統就會不(bu)夠用(yong)。在某項目(mu)中(zhong),就因為(wei)啟動參數(shu)使用(yong)的(de)默認(ren)值,經常報“OutOfMemory”錯(cuo)誤。因此,-Xms,-Xmx參數(shu)一(yi)定不(bu)要忘記加。

第二步,檢查(cha)錯(cuo)誤(wu)(wu)日(ri)志,查(cha)看“OutOfMemory”錯(cuo)誤(wu)(wu)前是否有(you)其它異常(chang)或錯(cuo)誤(wu)(wu)。在一個項目中,使用(yong)兩個數(shu)(shu)據(ju)庫(ku)連(lian)接,其中專用(yong)于發送短信的(de)數(shu)(shu)據(ju)庫(ku)連(lian)接使用(yong)DBCP連(lian)接池(chi)管理,用(yong)戶(hu)為不將短信發出(chu)(chu),有(you)意將數(shu)(shu)據(ju)庫(ku)連(lian)接用(yong)戶(hu)名改錯(cuo),使得日(ri)志中有(you)許(xu)多(duo)數(shu)(shu)據(ju)庫(ku)連(lian)接異常(chang)的(de)日(ri)志,一段時間后,就(jiu)出(chu)(chu)現“OutOfMemory”錯(cuo)誤(wu)(wu)。經(jing)分析(xi),這是由于DBCP連(lian)接池(chi)BUG引起的(de),數(shu)(shu)據(ju)庫(ku)連(lian)接不上后,沒(mei)有(you)將連(lian)接釋(shi)放(fang),最終使得DBCP報“OutOfMemory”錯(cuo)誤(wu)(wu)。經(jing)過修改正(zheng)確數(shu)(shu)據(ju)庫(ku)連(lian)接參數(shu)(shu)后,就(jiu)沒(mei)有(you)再出(chu)(chu)現內存溢出(chu)(chu)的(de)錯(cuo)誤(wu)(wu)。

查看(kan)日志對(dui)于分(fen)(fen)析內(nei)(nei)存溢出是非常重(zhong)要的(de),通過(guo)(guo)仔細查看(kan)日志,分(fen)(fen)析內(nei)(nei)存溢出前做過(guo)(guo)哪些操作,可以大(da)致定位(wei)有(you)問題的(de)模塊。

第三步,安(an)排有(you)經驗的編程人員對代碼(ma)進行走查和(he)分析,找(zhao)出(chu)可能發(fa)生內存(cun)溢(yi)出(chu)的位置。重點排查以下幾點:

1、檢(jian)查代碼中是(shi)否有死(si)循環或遞歸調用。

2、檢查是(shi)否有大循環重復產(chan)生新對象實體。

3、檢查(cha)對數據(ju)庫查(cha)詢中,是(shi)否有一次獲得全(quan)部數據(ju)的查(cha)詢。一般來說,如(ru)果一次取十萬條記錄到內存,就(jiu)可(ke)能引起內存溢出。這(zhe)個問題比較(jiao)隱蔽,在上(shang)線(xian)前(qian),數據(ju)庫中數據(ju)較(jiao)少,不容易出問題,上(shang)線(xian)后(hou),數據(ju)庫中數據(ju)多了(le),一次查(cha)詢就(jiu)有可(ke)能引起內存溢出。因此對于數據(ju)庫查(cha)詢盡量采用分(fen)頁的方式查(cha)詢。

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

第四步(bu),使(shi)用(yong)內(nei)(nei)存(cun)(cun)查看(kan)工具動(dong)態查看(kan)內(nei)(nei)存(cun)(cun)使(shi)用(yong)情況。某個(ge)項目上線后(hou),每次系統(tong)啟動(dong)兩(liang)天后(hou),就會出(chu)現內(nei)(nei)存(cun)(cun)溢出(chu)的錯誤。這種情況一般是(shi)代碼中出(chu)現了緩慢的內(nei)(nei)存(cun)(cun)泄漏,用(yong)上面三個(ge)步(bu)驟解(jie)決(jue)不了,這就需要使(shi)用(yong)內(nei)(nei)存(cun)(cun)查看(kan)工具了。

內存查看工具有許多,比較有名的有:Optimizeit Profiler、JProbeProfiler、JinSight和Java1.5的Jconsole等。它們的基本工作原理大同小異,都是監測Java程序運行時所有對象的申請、釋放等動作,將內存管理的所有信息(xi)進(jin)行(xing)統計、分析、可(ke)視化。開(kai)發人員(yuan)可(ke)以根據(ju)這(zhe)些信息(xi)判斷程序是(shi)否有內(nei)存(cun)泄漏(lou)問題(ti)。一(yi)般來說,一(yi)個(ge)正常(chang)的(de)(de)(de)系統在(zai)(zai)(zai)其啟動完成后其內(nei)存(cun)的(de)(de)(de)占用(yong)(yong)量是(shi)基(ji)本穩(wen)定的(de)(de)(de),而不應該是(shi)無限制(zhi)的(de)(de)(de)增(zeng)長(chang)的(de)(de)(de)。持(chi)續地觀察系統運行(xing)時使用(yong)(yong)的(de)(de)(de)內(nei)存(cun)的(de)(de)(de)大(da)小(xiao),可(ke)以看到在(zai)(zai)(zai)內(nei)存(cun)使用(yong)(yong)監(jian)控窗(chuang)口中(zhong)是(shi)基(ji)本規則的(de)(de)(de)鋸(ju)齒形的(de)(de)(de)圖線,如果內(nei)存(cun)的(de)(de)(de)大(da)小(xiao)持(chi)續地增(zeng)長(chang),則說明(ming)系統存(cun)在(zai)(zai)(zai)內(nei)存(cun)泄漏(lou)問題(ti)。通過間隔一(yi)段(duan)時間取一(yi)次內(nei)存(cun)快照(zhao),然(ran)后對(dui)內(nei)存(cun)快照(zhao)中(zhong)對(dui)象的(de)(de)(de)使用(yong)(yong)與引用(yong)(yong)等(deng)信息(xi)進(jin)行(xing)比對(dui)與分析,可(ke)以找出是(shi)哪個(ge)類的(de)(de)(de)對(dui)象在(zai)(zai)(zai)泄漏(lou)。

通過以上(shang)四個步驟的(de)分析(xi)與(yu)處理,基(ji)本能處理內存溢出的(de)問題。當然,在這些過程中也需要相當的(de)經驗(yan)與(yu)敏(min)感度(du),需要在實際的(de)開發與(yu)調試過程中不斷積(ji)累(lei)。

申明:以上方法源于程序系統索引或網民分享提供,僅供您參考使用,不代表本網站的研究觀點,證明有效,請注意甄別內容來源的真實性和權威性。

網站提醒和聲明
本(ben)(ben)站(zhan)(zhan)(zhan)為注(zhu)冊(ce)用戶(hu)提供(gong)信(xin)息存儲空間服務(wu),非“MAIGOO編(bian)輯上傳提供(gong)”的(de)文章/文字均是注(zhu)冊(ce)用戶(hu)自主發布上傳,不代表本(ben)(ben)站(zhan)(zhan)(zhan)觀(guan)點,更(geng)不表示本(ben)(ben)站(zhan)(zhan)(zhan)支持購買(mai)和交易,本(ben)(ben)站(zhan)(zhan)(zhan)對網頁中內容的(de)合法性(xing)(xing)(xing)、準(zhun)確性(xing)(xing)(xing)、真實(shi)性(xing)(xing)(xing)、適用性(xing)(xing)(xing)、安全性(xing)(xing)(xing)等概(gai)不負(fu)責。版權歸原(yuan)作者所有,如有侵權、虛假信(xin)息、錯誤信(xin)息或任何(he)問題,請及時聯系我們,我們將(jiang)在第一時間刪除或更(geng)正(zheng)。 申請刪除>> 糾錯>> 投訴侵權>>
提(ti)交(jiao)說明: 快速提交發布>> 查看提交幫助>> 注冊登錄>>
發表評論
您還未登錄,依《網絡安全法》相關要求,請您登錄賬戶后再提交發布信息。點擊登錄>>如您還未注冊,可,感謝您的理解及支持!
最新評(ping)論
暫無評論
頁面相關分類
熱門模塊
已有4078233個品牌入駐 更新519244個招商信息 已發布1590866個代理需求 已有1356721條品牌點贊