芒果视频下载

網(wang)站分類
登錄 |    

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

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

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

定義

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

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

原因

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

2、集合類中有對(dui)對(dui)象的引用,使(shi)用完后(hou)未清空,使(shi)得(de)JVM不能回(hui)收。

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

4、使(shi)用的第三方軟件中的BUG。

5、啟動參(can)數(shu)設(she)定的(de)過小。

二、內存溢出的解決問題

第一(yi)步,就是修(xiu)改JVM啟(qi)(qi)動(dong)(dong)參(can)數,直接增加內(nei)存。這一(yi)點看上去似乎很簡單,但很容易被忽略。JVM默認可以(yi)使(shi)用的內(nei)存為64M,Tomcat默認可以(yi)使(shi)用的內(nei)存為128MB,對于稍復(fu)雜(za)一(yi)點的系統(tong)就會不夠用。在某項目(mu)中,就因(yin)為啟(qi)(qi)動(dong)(dong)參(can)數使(shi)用的默認值,經(jing)常報“OutOfMemory”錯誤。因(yin)此,-Xms,-Xmx參(can)數一(yi)定(ding)不要忘(wang)記加。

第二步,檢查(cha)錯(cuo)(cuo)誤(wu)(wu)日志(zhi),查(cha)看“OutOfMemory”錯(cuo)(cuo)誤(wu)(wu)前(qian)是否有其它異常或(huo)錯(cuo)(cuo)誤(wu)(wu)。在一(yi)(yi)個(ge)項目中(zhong)(zhong),使(shi)用兩個(ge)數(shu)據(ju)庫(ku)(ku)連(lian)接(jie)(jie)(jie),其中(zhong)(zhong)專用于發(fa)送短信的數(shu)據(ju)庫(ku)(ku)連(lian)接(jie)(jie)(jie)使(shi)用DBCP連(lian)接(jie)(jie)(jie)池(chi)(chi)管理,用戶為不將(jiang)短信發(fa)出,有意將(jiang)數(shu)據(ju)庫(ku)(ku)連(lian)接(jie)(jie)(jie)用戶名改(gai)錯(cuo)(cuo),使(shi)得(de)日志(zhi)中(zhong)(zhong)有許多數(shu)據(ju)庫(ku)(ku)連(lian)接(jie)(jie)(jie)異常的日志(zhi),一(yi)(yi)段時間后(hou)(hou),就出現(xian)(xian)“OutOfMemory”錯(cuo)(cuo)誤(wu)(wu)。經(jing)(jing)分析,這是由于DBCP連(lian)接(jie)(jie)(jie)池(chi)(chi)BUG引起的,數(shu)據(ju)庫(ku)(ku)連(lian)接(jie)(jie)(jie)不上后(hou)(hou),沒有將(jiang)連(lian)接(jie)(jie)(jie)釋放(fang),最終使(shi)得(de)DBCP報(bao)“OutOfMemory”錯(cuo)(cuo)誤(wu)(wu)。經(jing)(jing)過修改(gai)正確數(shu)據(ju)庫(ku)(ku)連(lian)接(jie)(jie)(jie)參(can)數(shu)后(hou)(hou),就沒有再(zai)出現(xian)(xian)內存溢出的錯(cuo)(cuo)誤(wu)(wu)。

查看日志對于(yu)分析內(nei)存(cun)溢出是(shi)非常重要的(de),通過仔細查看日志,分析內(nei)存(cun)溢出前做過哪些操作,可(ke)以大致(zhi)定(ding)位有問題的(de)模(mo)塊。

第三步,安排有經驗的編程(cheng)人員對代(dai)碼進行(xing)走查(cha)(cha)和(he)分(fen)析,找出可能發生內(nei)存溢出的位置。重點排查(cha)(cha)以下幾(ji)點:

1、檢查(cha)代(dai)碼中是(shi)否有死循(xun)環或遞(di)歸調用。

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

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

4、檢查List、MAP等集合(he)對象(xiang)是否有使用(yong)完后,未(wei)清除的問(wen)題。List、MAP等集合(he)對象(xiang)會始終存有對對象(xiang)的引用(yong),使得這些對象(xiang)不能被GC回(hui)收(shou)。

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

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

通過(guo)以上四(si)個步驟的分析與處(chu)(chu)理,基本能處(chu)(chu)理內存溢出的問題。當然,在(zai)這些過(guo)程中也(ye)需要相(xiang)當的經驗(yan)與敏感度(du),需要在(zai)實際的開發與調(diao)試過(guo)程中不(bu)斷(duan)積累。

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

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