天天看點

java堆溢出 java.lang.outofMemoryError:java heap space

背景:

   通過封包,向核心系統擷取D-1日交易明細,存放資料庫。每日交易量目前1w.每個月交易量有10%到20%的增長。

擷取核心交易明細,用于對賬

   建立socket短連接配接,10000條交易明細,需建立100次短連接配接。每次短連接配接,傳輸的封包大概50000個位元組

風險:

 1.因為需要建立多次短連接配接,某一次連接配接的失敗,之前擷取的資料全部丢棄。

 2.同時多次建立連接配接,關閉連接配接,耗費性能 

 3.因為對接系統封包的限制,每次擷取的封包大小,隻能是50kb。每連接配接一次,需要在方法區建立一個50kb的字元串。并且,我解析入庫之後,就沒用了。朝生夕死的大對象。(不知道50kb算不算大對象,但确實耗費空間,且無用),未來日交易量增加到10w,100w更是如此

遇到的事故:在測試環境裡。因為連續測試,導緻堆記憶體溢出

java堆溢出 java.lang.outofMemoryError:java heap space

後面檢視jvm記憶體情況

java堆溢出 java.lang.outofMemoryError:java heap space

系統jvm記憶體2個G。老年代和永久代。快占滿了。

java堆溢出 java.lang.outofMemoryError:java heap space

主要是,字元串,以及我解析字元串建立的對象執行個體,居高不下。

java堆溢出 java.lang.outofMemoryError:java heap space

問題:

1.仔細看了代碼,沒有發現記憶體洩露的情況。但是,不能了解,目前老年代和永久代,占用記憶體居高不下。但是後面發現,在出堆記憶體溢出後。并沒有回收記憶體,無論是年輕代,還是永久代,都沒有回收

2.從圖中可以看到永久代配置設定(committed)的記憶體已經滿了。為什麼沒有配置設定新的記憶體。