芒果视频下载

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

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

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

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

定義

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

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

原因

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

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

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

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

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

二、內存溢出的解決問題

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

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

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

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

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

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

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

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

第(di)四步,使用內(nei)(nei)存查(cha)看(kan)工具動態查(cha)看(kan)內(nei)(nei)存使用情況。某個(ge)項(xiang)目上線后,每次系統啟動兩天后,就(jiu)會出(chu)現(xian)內(nei)(nei)存溢出(chu)的錯(cuo)誤(wu)。這(zhe)種(zhong)情況一般是代碼中出(chu)現(xian)了(le)緩(huan)慢(man)的內(nei)(nei)存泄漏,用上面三個(ge)步驟解決不了(le),這(zhe)就(jiu)需要使用內(nei)(nei)存查(cha)看(kan)工具了(le)。

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

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

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

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