芒果视频下载

網(wang)站分(fen)類
登錄 |    

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

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

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

定義

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

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

原因

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

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

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

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

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

二、內存溢出的解決問題

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

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

查看日志對于分析內存溢(yi)出是(shi)非常重要的,通(tong)過(guo)(guo)仔細查看日志,分析內存溢(yi)出前做過(guo)(guo)哪(na)些(xie)操作,可以大致(zhi)定(ding)位(wei)有問題(ti)的模塊。

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

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

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

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

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

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

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

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

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

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