java寫法可能存在的 java.lang.OutOfMemoryError: Java heap space 問題
阿新 • • 發佈:2020-10-11
這也算一種最常見的、但是容易忽略的一種潛在問題吧
背景
在某個資料校驗輸出過程時會產生較多的臨時資料,這些臨時資料若不及時處理,可能會導致堆記憶體溢位。
過程
從圖中可知,記憶體達到50%左右會進行一次gc操作,在某次gc操作之後呼叫某個介面,該介面產生了較多的臨時資料
多次呼叫,結果顯示,每次呼叫時介面,都進行了gc操作,但是上次操作已經結束數秒了,結果gc的並不是很徹底,所以堆記憶體的容量擴容了,但是這樣下去遲早會達到計算機的記憶體(理論上是這樣,但是系統應該會進行full GC吧)
此時手動進行一次垃圾回收,結果如圖下,這種GC應該是full GC型別。。。
現在加了一個操作,每次操作都把臨時資料清理一遍,相當於一開始一個大筐子放雞蛋,雞蛋沒放完就不能拿走,現在是分成幾個小筐子,每次裝完了一個筐子就把滿的拿走,然後裝下一個筐子
結果如圖,連續呼叫介面,記憶體GC達到了一個比較好的情況 。。。
分析
前者沒有clear,容易讓一些臨時資料倖存過gc,最壞的結果進入gc老年區(我明明執行手動gc了但是最下限提高了,說明有的資料成了老年區資料),雖然jvm有個記憶體擴容機制以及full gc,但是full gc存在效能和安全性問題,所以若一些不用的臨時資料最好及時清理,這種情況在一些迴圈校驗場景比較常見。
另外的問題
系統的gc和自己手動gc具體區別