最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

內存泄漏和內存溢出的區(qū)別?如何解決?

2023-04-10 14:12 作者:云和數(shù)據(jù)何老師  | 我要投稿


內存溢出 out of memory

是指程序在申請內存時,沒有足夠的內存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數(shù),那就是內存溢出。

內存泄露 memory leak

是指程序在申請內存后,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積后果很嚴重,無論多少內存,遲早會被占光。

memory leak會最終會導致out of memory!

內存溢出就是你要求分配的內存超出了系統(tǒng)能給你的,系統(tǒng)不能滿足需求,于是產(chǎn)生溢出。?內存泄漏是指你向系統(tǒng)申請分配內存進行使用(new),可是使用完了以后卻不歸還(delete),結果你申請到的那塊內存你自己也不能再訪問(也許你把它的地址給弄丟了),而系統(tǒng)也不能再次將它分配給需要的程序。一個盤子用盡各種方法只能裝4個果子,你裝了5個,結果掉倒地上不能吃了。這就是溢出!比方說棧,棧滿時再做進棧必定產(chǎn)生空間溢出,叫上溢,??諘r再做退棧也產(chǎn)生空間溢出,稱為下溢。就是分配的內存不足以放下數(shù)據(jù)項序列,稱為內存溢出。

以發(fā)生的方式來分類,內存泄漏可以分為4類:

1. 常發(fā)性內存泄漏。發(fā)生內存泄漏的代碼會被多次執(zhí)行到,每次被執(zhí)行的時候都會導致一塊內存泄漏。

2. 偶發(fā)性內存泄漏。發(fā)生內存泄漏的代碼只有在某些特定環(huán)境或操作過程下才會發(fā)生。常發(fā)性和偶發(fā)性是相對的。對于特定的環(huán)境,偶發(fā)性的也許就變成了常發(fā)性的。所以測試環(huán)境和測試方法對檢測內存泄漏至關重要。

3. 一次性內存泄漏。發(fā)生內存泄漏的代碼只會被執(zhí)行一次,或者由于算法上的缺陷,導致總會有一塊僅且一塊內存發(fā)生泄漏。比如,在類的構造函數(shù)中分配內存,在析構函數(shù)中卻沒有釋放該內存,所以內存泄漏只會發(fā)生一次。

4. 隱式內存泄漏。程序在運行過程中不停的分配內存,但是直到結束的時候才釋放內存。嚴格的說這里并沒有發(fā)生內存泄漏,因為最終程序釋放了所有申請的內存。但是對于一個服務器程序,需要運行幾天,幾周甚至幾個月,不及時釋放內存也可能導致最終耗盡系統(tǒng)的所有內存。所以,我們稱這類內存泄漏為隱式內存泄漏。

從用戶使用程序的角度來看,內存泄漏本身不會產(chǎn)生什么危害,作為一般的用戶,根本感覺不到內存泄漏的存在。真正有危害的是內存泄漏的堆積,這會最終消耗盡系統(tǒng)所有的內存。從這個角度來說,一次性內存泄漏并沒有什么危害,因為它不會堆積,而隱式內存泄漏危害性則非常大,因為較之于常發(fā)性和偶發(fā)性內存泄漏它更難被檢測到。

內存溢出的原因以及解決方法

內存溢出的解決方案:

引起內存溢出的原因有很多種,列舉一下常見的有以下幾種:

1. 內存中加載的數(shù)據(jù)量過于龐大,如一次從數(shù)據(jù)庫取出過多數(shù)據(jù);

2. 集合類中有對對象的引用,使用完后未清空,使得JVM不能回收;

3. 代碼中存在死循環(huán)或循環(huán)產(chǎn)生過多重復的對象實體;

4. 使用的第三方軟件中的BUG;

5. 啟動參數(shù)內存值設定的過小

內存溢出的解決方案:

第一步,修改JVM啟動參數(shù),直接增加內存。(-Xms,-Xmx參數(shù)一定不要忘記加。)

第二步,檢查錯誤日志,查看“OutOfMemory”錯誤前是否有其它異常或錯誤。

第三步,對代碼進行走查和分析,找出可能發(fā)生內存溢出的位置。

重點排查以下幾點:

1. 檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。

2. 檢查代碼中是否有死循環(huán)或遞歸調用。

3. 檢查是否有大循環(huán)重復產(chǎn)生新對象實體。

4. 檢查對數(shù)據(jù)庫查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,數(shù)據(jù)庫中數(shù)據(jù)較少,不容易出問題,上線后,數(shù)據(jù)庫中數(shù)據(jù)多了,一次查詢就有可能引起內存溢出。因此對于數(shù)據(jù)庫查詢盡量采用分頁的方式查詢。

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

第四步,使用內存查看工具動態(tài)查看內存使用情況。


內存泄漏和內存溢出的區(qū)別?如何解決?的評論 (共 條)

分享到微博請遵守國家法律
浙江省| 岳西县| 康马县| 拉孜县| 澄江县| 右玉县| 五华县| 呼伦贝尔市| 白朗县| 刚察县| 新营市| 陕西省| 临高县| 汝南县| 太湖县| 和田县| 平顺县| 渭源县| 凤翔县| 通山县| 金山区| 新昌县| 玉山县| 乃东县| 德兴市| 鄄城县| 故城县| 九龙县| 天台县| 小金县| 神木县| 广饶县| 仁布县| 甘德县| 周宁县| 吉林省| 江安县| 苏尼特左旗| 平塘县| 平顺县| 清原|