Java架構師中的內存溢出和內存泄漏是啥子?實際操作案例!

(Java架構師交流企Q鵝裙/:445820908 )

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

專注於Java架構師技術分享,撩我免費送Java成套架構師晉級資料

當我們想把自個兒定義的類保管到散列表的時分,需要保障對象的 hashCode 不可變。

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

可以看見,在測試辦法中,當元素的 hashCode 發生變更然後,就再也找不到變更之前的那個元素了;

  • Hash 值發生變更,譬如下邊中的這個類,它的 hashCode 會隨著變量 x 的變動而變動:
  • Java架構師中的內存溢出和內存泄漏是啥子?實際操作案例!
    Java架構師中的內存溢出和內存泄漏是啥子?實際操作案例!

  • 內部類的對象被長期保有,那麼內部類對象所屬的外部類對象也不會被回收。
  • 數據連署、IO、Socket連署等等,它們務必預示開釋(用代碼 close 掉),否則不會被 GC 回收。
    Java架構師中的內存溢出和內存泄漏是啥子?實際操作案例!

    1. 單例模式,和靜態聚齊以致內存泄漏的端由類似,因為單例的靜態特性,它的性命周期和 JVM 的性命周期同樣長,所以假如單例對象假如保有外部對象的援用,那麼這個外部對象也不會被回收,那麼便會導致內存泄漏。
    2. 靜態聚齊類引動內存泄漏,因為靜態聚齊的性命周期和 JVM 相符,所以靜態聚齊援用的對象不得被開釋;下邊這個例子中,list 是靜態的,只要 JVM 不已,那麼 obj 也一直不會開釋。

    Java架構師中的內存溢出和內存泄漏是啥子?實際操作案例!

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

      以致內存泄漏的常見端由

      03

      隱式泄漏:一直佔著內存不開釋,直至執行終了;嚴格的說這個不算內存泄漏,因為終極開釋掉了,不過假如執行時間漫長,也可能會以致內存耗盡。

      ·

      ·

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

      ·

      ·

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

      ·

      ·

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

      ·

      泄漏的分類

      02

      假如對象X還援用著性命周期比較短的A、B、C,對象A又援用著對象 a、b、c,這麼就可能導致大量無用的對象不得被回收,進而佔領了內存資源,導致內存泄漏,直至內存溢出。

      那麼當Y性命周期終了的時分,X傲然援用著Y,這會兒,垃圾回收期是不會回收對象Y的;

      對象 X 援用對象 Y,X 的性命周期比 Y 的性命周期長;

      如上圖:

      這是一個很有味道的例子。
      Java架構師中的內存溢出和內存泄漏是啥子?實際操作案例!

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

      通俗一點兒兒講,一個廁所就三個坑,有兩個站著茅坑不走的(內存泄漏),餘下最終一個坑,廁所表達接待壓力巨大,這會兒一下來了兩私人,坑位(內存)就不夠了,內存泄漏成為內存溢出了。

      聲請內存時,沒有足夠的內存可以使役;

      2.內存溢出(out of memory)

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

      聲請了內存用完了不開釋,譬如總共有 1024M 的內存,分配了 521M 的內存一直不回收,那麼可以用的內存只有 521M 了,仿佛泄漏掉了一局部;

      1.內存泄漏(memory leak )

      內存泄漏 & 內存溢出

      01

      JAVA中的內存溢出和內存泄漏作別是啥子,有啥子結合和差別,讓我們來看一看。

      Java架構師中的內存溢出和內存泄漏是啥子?實際操作案例!


  • 發表迴響

    你的電子郵件位址並不會被公開。 必要欄位標記為 *