芒果视频下载

網站分類
登錄 |    

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

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

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

定義

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

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

原因

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

2、集合類中有對對象的引(yin)用(yong),使用(yong)完后未(wei)清空(kong),使得JVM不(bu)能回收。

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

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

5、啟動參數設定的過小。

二、內存溢出的解決問題

第(di)一(yi)步,就是修改JVM啟(qi)(qi)動參(can)數(shu),直接(jie)增加內存。這一(yi)點看上去似乎很簡(jian)單,但(dan)很容易被忽略(lve)。JVM默認(ren)可以使(shi)用的(de)內存為64M,Tomcat默認(ren)可以使(shi)用的(de)內存為128MB,對(dui)于(yu)稍復雜一(yi)點的(de)系(xi)統就會不(bu)夠(gou)用。在某項(xiang)目中,就因為啟(qi)(qi)動參(can)數(shu)使(shi)用的(de)默認(ren)值,經(jing)常報“OutOfMemory”錯誤(wu)。因此(ci),-Xms,-Xmx參(can)數(shu)一(yi)定(ding)不(bu)要忘記加。

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

查(cha)看日志對于分析內存(cun)溢出是非(fei)常(chang)重要(yao)的(de),通過仔細查(cha)看日志,分析內存(cun)溢出前做過哪些(xie)操(cao)作,可以大致(zhi)定位有問題的(de)模塊(kuai)。

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

1、檢(jian)查代(dai)碼中是否有(you)死循環或(huo)遞歸(gui)調用。

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

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

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

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

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

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

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

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