內(nèi)存溢出和內(nèi)存泄露的區(qū)別以及在解決辦法

內(nèi)存泄漏(memory leak)

是指程序在申請內(nèi)存后,無法釋放已申請的內(nèi)存空間,一次內(nèi)存泄漏似乎不會有大的影響,但內(nèi)存泄漏堆積后的后果就是內(nèi)存溢出绞幌。

內(nèi)存溢出(out of memory )

指程序申請內(nèi)存時,沒有足夠的內(nèi)存供申請者使用一忱,或者說莲蜘,給了你一塊存儲int類型數(shù)據(jù)的存儲空間,但是你卻存儲long類型的數(shù)據(jù)帘营,那么結(jié)果就是內(nèi)存不夠用票渠,此時就會報錯OOM,即所謂的內(nèi)存溢出。

內(nèi)存泄漏的分類

  • 常發(fā)性內(nèi)存泄漏
    發(fā)生內(nèi)存泄漏的代碼會被多次執(zhí)行到芬迄,每次被執(zhí)行的時候都會導致一塊內(nèi)存泄漏问顷。
  • 偶發(fā)性內(nèi)存泄漏
    發(fā)生內(nèi)存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會發(fā)生。
  • 一次性內(nèi)存泄漏:
    發(fā)生內(nèi)存泄漏的代碼只會被執(zhí)行一次禀梳,或者由于算法上的缺陷杜窄,導致總會有一塊僅且一塊內(nèi)存發(fā)生泄漏。
  • 隱式內(nèi)存泄漏:
    程序在運行過程中不停的分配內(nèi)存算途,但是直到結(jié)束的時候才釋放內(nèi)存塞耕。嚴格的說這里并沒有發(fā)生內(nèi)存泄漏,因為最終程序釋放了所有申請的內(nèi)存郊艘。但是對于一個服務器程序荷科,需要運行幾天唯咬,幾周甚至幾個月纱注,不及時釋放內(nèi)存也可能導致最終耗盡系統(tǒng)的所有內(nèi)存。所以胆胰,我們稱這類內(nèi)存泄漏為隱式內(nèi)存泄漏狞贱。

常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境蜀涨,偶發(fā)性的也許就變成了常發(fā)性的瞎嬉。所以測試環(huán)境和測試方法對檢測內(nèi)存泄漏至關(guān)重要蝎毡。

內(nèi)存溢出原因

  1. 內(nèi)存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù)氧枣;
  2. 集合類中有對對象的引用沐兵,使用完后未清空,使得JVM不能回收便监;
  3. 代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復的對象實體扎谎;
  4. 使用的第三方軟件中的BUG;
  5. 啟動參數(shù)內(nèi)存值設(shè)定的過小

內(nèi)存溢出的解決方案:

  • 第一步烧董,修改JVM啟動參數(shù)毁靶,直接增加內(nèi)存。(-Xms逊移,-Xmx參數(shù)一定不要忘記加预吆。)
  • 第二步,檢查錯誤日志胳泉,查看“OutOfMemory”錯誤前是否有其 它異彻詹妫或錯誤。
  • 第三步胶背,對代碼進行走查和分析巷嚣,找出可能發(fā)生內(nèi)存溢出的位置。

1.檢查對數(shù)據(jù)庫查詢中钳吟,是否有一次獲得全部數(shù)據(jù)的查詢廷粒。一般來說,如果一次取十萬條記錄到內(nèi)存红且,就可能引起內(nèi)存溢出坝茎。這個問題比較隱蔽,在上線前暇番,數(shù)據(jù)庫中數(shù)據(jù)較少嗤放,不容易出問題,上線后壁酬,數(shù)據(jù)庫中數(shù)據(jù)多了次酌,一次查詢就有可能引起內(nèi)存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢舆乔。
2.檢查代碼中是否有死循環(huán)或遞歸調(diào)用岳服。
3.檢查是否有大循環(huán)重復產(chǎn)生新對象實體。
4.檢查List希俩、MAP等集合對象是否有使用完后吊宋,未清除的問題。List颜武、MAP等集合對象會始終存有對對象的引用璃搜,使得這些對象不能被GC回收拖吼。

  • 第四步,使用內(nèi)存查看工具動態(tài)查看內(nèi)存使用情況
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末这吻,一起剝皮案震驚了整個濱河市吊档,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唾糯,老刑警劉巖籍铁,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異趾断,居然都是意外死亡拒名,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門芋酌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來增显,“玉大人,你說我怎么就攤上這事脐帝⊥疲” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵堵腹,是天一觀的道長炸站。 經(jīng)常有香客問我,道長疚顷,這世上最難降的妖魔是什么旱易? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮腿堤,結(jié)果婚禮上阀坏,老公的妹妹穿的比我還像新娘。我一直安慰自己笆檀,他們只是感情好忌堂,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酗洒,像睡著了一般士修。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上樱衷,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天棋嘲,我揣著相機與錄音,去河邊找鬼箫老。 笑死封字,一個胖子當著我的面吹牛黔州,可吹牛的內(nèi)容都是我干的耍鬓。 我是一名探鬼主播阔籽,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牲蜀!你這毒婦竟也來了笆制?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤涣达,失蹤者是張志新(化名)和其女友劉穎在辆,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體度苔,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡匆篓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寇窑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸦概。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖甩骏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饮笛,我是刑警寧澤咨察,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布福青,位于F島的核電站摄狱,受9級特大地震影響无午,放射性物質(zhì)發(fā)生泄漏二蓝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一指厌、第九天 我趴在偏房一處隱蔽的房頂上張望刊愚。 院中可真熱鬧,春花似錦鸥诽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袭异。三九已至钠龙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背碴里。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工沈矿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咬腋。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像根竿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子寇壳,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348