1. 程式人生 > >java.lang.OutOfMemoryError: Java heap space 記憶體溢位問題排查

java.lang.OutOfMemoryError: Java heap space 記憶體溢位問題排查

最近一直排查系統中的記憶體溢位問題。

不管是用jmap指令還是用比較直觀的jvisualvm工具。都可以看到堆記憶體中各個物件的數量以及佔用的記憶體大小。

一般只要找到有大量的自定義物件一直無法釋放,那麼距離定位到問題就不遠了。

來看一個例子吧:

就像圖裡看到的這樣 一般都是這些物件數量巨大記憶體大部分也都是他們佔用的。

今天明確了一個問題,這裡統計的String物件指所有的String物件,包含在其他類中的屬性。

比如我們自定義一個類 xxx 有10個String型別的屬性,如果有10萬個xxx物件,那麼堆裡就會多100萬個String物件。(所有屬性都必須是有值的而且是一個新的物件)。

而當我們看到自定義物件只佔用記憶體的百分之幾的時候,要知道物件如果屬性很多的話,算是我們物件引用的所有物件。佔用的總記憶體可能是非常大的。

如果某個執行緒執行時間過長,那麼就很危險了。佔用的記憶體無法釋放。就容易造成記憶體的溢位。

如果自定義物件超過10萬,就有記憶體溢位的危險了。

記憶體溢位的問題,首先看物件數會不會太多,如果太多可能 直接在建立過程中就溢位了。

其次,看執行緒的處理時間,如果能很快結束,記憶體就會很快釋放。