芒果视频下载

網(wang)站分類
登錄 |    

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

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

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

定義

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

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

原因

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

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

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

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

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

二、內存溢出的解決問題

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

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

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

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

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

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

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

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

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

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

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

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

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