亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中的內存泄露與內存溢出是什么?為什么會出現內存溢出和內存泄露?

發布時間:2020-06-04 16:16:09 來源:億速云 閱讀:335 作者:Leah 欄目:編程語言

Java中的內存泄露與內存溢出是什么?為什么會出現內存溢出和內存泄露?這些問題可能是我們日常工作會見到的。通過這些問題,希望你能收獲更多。下面是揭開這些問題的詳細內容。

01

內存泄漏 & 內存溢出

1.內存泄漏(memory leak )

申請了內存用完了不釋放,比如一共有 1024M 的內存,分配了 521M 的內存一直不回收,那么可以用的內存只有 521M 了,仿佛泄露掉了一部分;

通俗一點講的話,內存泄漏就是【占著茅坑不拉shi】。

2.內存溢出(out of memory)

申請內存時,沒有足夠的內存可以使用;

通俗一點兒講,一個廁所就三個坑,有兩個站著茅坑不走的(內存泄漏),剩下最后一個坑,廁所表示接待壓力很大,這時候一下子來了兩個人,坑位(內存)就不夠了,內存泄漏變成內存溢出了。

可見,內存泄漏和內存溢出的關系:內存泄露的增多,最終會導致內存溢出。

這是一個很有味道的例子。
Java中的內存泄露與內存溢出是什么?為什么會出現內存溢出和內存泄露?

如上圖:

對象 X 引用對象 Y,X 的生命周期比 Y 的生命周期長;

那么當Y生命周期結束的時候,X依然引用著Y,這時候,垃圾回收期是不會回收對象Y的;

如果對象X還引用著生命周期比較短的A、B、C,對象A又引用著對象 a、b、c,這樣就可能造成大量無用的對象不能被回收,進而占據了內存資源,造成內存泄漏,直到內存溢出。

02

泄漏的分類

經常發生:發生內存泄露的代碼會被多次執行,每次執行,泄露一塊內存;

偶然發生:在某些特定情況下才會發生;

一次性:發生內存泄露的方法只會執行一次;

隱式泄露:一直占著內存不釋放,直到執行結束;嚴格的說這個不算內存泄露,因為最終釋放掉了,但是如果執行時間特別長,也可能會導致內存耗盡。

03

導致內存泄漏的常見原因

  1. 循環過多或死循環,產生大量對象;

  2. 靜態集合類引起內存泄漏,因為靜態集合的生命周期和 JVM 一致,所以靜態集合引用的對象不能被釋放;下面這個例子中,list 是靜態的,只要 JVM 不停,那么 obj 也一直不會釋放。

Java中的內存泄露與內存溢出是什么?為什么會出現內存溢出和內存泄露?

  1. 單例模式,和靜態集合導致內存泄露的原因類似,因為單例的靜態特性,它的生命周期和 JVM 的生命周期一樣長,所以如果單例對象如果持有外部對象的引用,那么這個外部對象也不會被回收,那么就會造成內存泄漏。

  2. 數據連接、IO、Socket連接等等,它們必須顯示釋放(用代碼 close 掉),否則不會被 GC 回收。
    Java中的內存泄露與內存溢出是什么?為什么會出現內存溢出和內存泄露?

  3. 內部類的對象被長期持有,那么內部類對象所屬的外部類對象也不會被回收。

  4. Hash 值發生改變,比如下面中的這個類,它的 hashCode 會隨著變量 x 的變化而變化:

Java中的內存泄露與內存溢出是什么?為什么會出現內存溢出和內存泄露?
Java中的內存泄露與內存溢出是什么?為什么會出現內存溢出和內存泄露?

可以看到,在測試方法中,當元素的 hashCode 發生改變之后,就再也找不到改變之前的那個元素了;

這也是 String 為什么被設置成了不可變類型,我們可以放心地把 String 存入 HashSet,或者把 String 當做 HashMap 的 key 值;

當我們想把自己定義的類保存到散列表的時候,需要保證對象的 hashCode 不可變。

  1. 內存中加載數據量過大;之前項目在一次上線的時候,應用啟動奇慢直到夯死,就是因為代碼中會加載一個表中的數據到緩存(內存)中,測試環境只有幾百條數據,但是生產環境有幾百萬的數據。

看完上述內容,你們對Java中的內存泄露與內存溢大概了解了嗎?如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇礼县| 英山县| 班戈县| 崇仁县| 台湾省| 廊坊市| 亚东县| 临桂县| 二连浩特市| 凤庆县| 上栗县| 阿瓦提县| 清水县| 晋江市| 阜康市| 巴东县| 乌苏市| 吉林市| 咸阳市| 津南区| 阜新市| 温州市| 兴国县| 遂川县| 宿松县| 库伦旗| 深泽县| 宣化县| 铜川市| 浦县| 招远市| 喀喇沁旗| 花莲市| 禄丰县| 杭锦后旗| 华亭县| 福鼎市| 和田县| 威远县| 肃宁县| 宜州市|