回覆列表
  • 1 # 此生唯一

    我們都知道,Java憑藉JVM有一套自動回收物件的機制,能自動進行記憶體管理,但這不是一勞永逸的方法,記憶體洩露和記憶體溢位還是會時時侵擾java程式設計人員!先來看下記憶體相應的概念!

    記憶體洩露:記憶體中的無用物件因為引用存在,物件遲遲不能回收,導致記憶體佔用越來越高,最終導致記憶體溢位; 比較常見的場景是生命週期短的物件已經不再需要,但是生命週期比較長的物件有著短週期的物件引用,導致記憶體洩露;

    記憶體溢位:程式想要獲取記憶體的時候,已經沒有新的記憶體可供使用,這時就爆出了out of memory ,記憶體溢位又分為堆溢位和棧溢位!

    堆溢位常見關鍵字有java.lang.OutOfMemoryError: Java heap space

    棧溢位常見關鍵字java.lang.StackOverflowError

    記憶體洩露的本質就是無用物件的持續增長,比如說:

    1,靜態類物件中儲存其他物件,因為static的宣告週期長,放入這些物件的其他物件遲遲得不到釋放;

    2,諸如資料庫連線等網路,io連線,必須要顯式的close掉,否則也容易洩露;

    3,單例模式初始化物件時,引用其他的物件引用,也將導致物件不能釋放;

    如何避免記憶體洩露呢?長週期的物件中儘量不要引用短週期的物件,或者及時釋放;可以經常使用jstack等記憶體工具監控記憶體的增長情況,及時進行處理!

    記憶體洩露如果不是很嚴重,一時半會兒也發現不了,發展下去通常會變成情節嚴重的記憶體溢位!

    我們知道堆主要用來放物件,棧用來存放物件引用,堆疊溢位通常是不同的原因導致的!

    堆溢位常見的情景如下:

    1,堆記憶體分配過小:可透過-Xms2048m -Xmx2048m調整堆記憶體

    2,執行緒數過大,超過了作業系統限制

    3.java.lang.OutOfMemoryError:PermGenspace:老年代溢位,可透過-XX:MaxPermSize=128m -XXermSize=128m調整

    棧溢位常見情景如下:

    遞迴呼叫方法,會建立大量棧幀,直至溢位!

    無論是堆疊溢位還是洩露,幾乎都是程式碼編寫不嚴謹引起,最主要的是注意不要大量建立物件或者執行緒,並注意及時釋放!

    最近會持續的的分享JAVA開發相關技術,敬請關注。。

  • 2 # 會點程式碼的大叔

    JAVA中的記憶體溢位和記憶體洩露分別是什麼,有什麼聯絡和區別,我談談自己的理解。

    記憶體洩漏(memory leak ):申請了記憶體不釋放,比如100m的記憶體,分配了10m的記憶體一直不回收,那麼可以用的記憶體只有90m了,彷彿洩露掉了一部分;通俗一點講的話就是【佔著茅坑不拉shi】。

    記憶體溢位(out of memory):申請記憶體時,沒有足夠的記憶體可以使用;通俗一點兒講,一個廁所就三個坑,有兩個站著茅坑不走的,剩下最後一個表示壓力很大,這時候一下子來了兩個人,坑位(記憶體)就不夠了。

    記憶體洩漏和記憶體溢位的關係:記憶體洩露的增多,最終會導致記憶體溢位。

    這是一個很有味道的例子......

    如上圖,物件X引用物件Y,X的生命週期為60,Y的生命週期為20,當Y生命週期結束的時候,X依然引用著B,這時候,垃圾回收期是不會回收物件Y的;如果物件X還引用著生命週期比較短的A、B、C...物件A又引用著物件a、b、c...

    那麼就可能造成大量無用的物件不能被回收,進而佔據了記憶體資源,造成記憶體洩漏,直到記憶體溢位。

    記憶體洩漏的分類

    經常(不斷)發生:發生記憶體洩露的程式碼會被多次執行,每次執行,洩露一塊記憶體;

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

    一次性:發生記憶體洩露的方法只會執行一次;

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

    記憶體洩露產生的可能原因

    迴圈過多或死迴圈,產生大量物件;

    靜態集合類引起記憶體洩漏,因為靜態集合的生命週期和應用一致,所以靜態集合引用的物件不能被釋放;

    單例模式,和靜態集合導致記憶體洩露的原因類似;

    事件監聽(listeners)和回撥(callbacks);

    各種連線,比如資料庫連線、Socket連線、IO等,必須顯式釋放(close);

    記憶體中載入資料量過大;我之前專案有一次上線的時候,應用啟動奇慢直到夯死,就是因為程式碼中會載入一個表中的資料到快取(記憶體)中,測試環境只有幾百條資料,但是生產環境有幾百萬的資料。

  • 中秋節和大豐收的關聯?
  • 為什麼在二戰中,對義大利提及比較少呢?