1.內存泄露:
Java的內存泄漏是指某些對象不再被應用程序使用,而垃圾收集器(Garbage Collector)卻沒能識別它們是“不再使用的”,所以沒有對這些對象進行回收,或者由于某些原因無法回收或者回收不徹底!
舉例:
各種連接,比如數據庫連接(dataSourse.getConnection()),網絡連接(socket)和io連接,除非其顯式的調用了其close()方法將其連接關閉,否則是不會自動被GC 回收的。
靜態集合類沒有被釋放-對象沒有被釋放
遞歸調用層次太多
如果那些不使用的對象占用堆(heap)空間足夠大,使得應用程序無法滿足下一次內存分配需求,就會導致OutOfMemoryError錯誤。
內存泄漏和系統超負荷兩者是有區別的,雖然可能導致的最終結果是一樣的。
內存泄漏是用完的資源沒有回收引起錯誤,而系統超負荷則是系統確實沒有那么多資源可以分配了(其他的資源都在使用)。
內存泄漏可以通過軟件調優來解決,系統超負荷則只能通過更新硬件來解決。
2.內存泄漏的表現
---內存快被占滿,但還沒被占滿,處于臨界點,這時候不會有報錯,但會影響性能
---日志里明確產生OOM等錯誤。比如,下圖,回落點連起來基本水平則表示正?;厥?,反之回收不徹底。
?
3.內存泄露的排查思路:
-----JVM和GC的關鍵參數設置(比如,-Xms -Xmx等都沒有設置,那么可能會出現內存泄露)
-----排查代碼
4.OutOfMemory常見類型
----堆空間被占滿:https://blog.51cto.com/11009785/2382260
----永久代/元空間被占滿:https://blog.51cto.com/11009785/2379670
----棧溢出:java.lang.stackoverflowerror;fatal:stack size too small
??????????排查:先看參數-Xss:每個線程的棧大小,用于保存函數調用、返回地址等,默認1M,如果報錯,改為2M,如果還不行,捕獲快照,去排查代碼,有可能是遞歸調用的層次太多了。
----系統內存被占滿:java.lang.outofmemoryerror:unable to create new native thread
? ? 解決:升級硬件
5.java.lang.OutOfMemoryError錯誤的可能原因,及排查思路:
---空間不足
? ?---首先排查是不是硬件方面的問題
?? ---如果硬件不錯,再排查參數,是不是設置的小了
---內存泄漏
? ?---如果硬件和參數都沒問題,那么懷疑是內存泄露,需要排查JVM和GC的參數設置,如果還不行,需要排查代碼
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。