由同事轉述的一篇文章,主要是因為發現我們開發的專案,在某些狀況下會拋出記憶體不足的錯誤,但記憶體使用量似乎還沒有用滿。
後來同事查到了這個可能性,因為我們專案中使用了不少 Runtime.exec() 去存取 Linux 的 Shell Script
這時就會出現 [1] 中描述的狀況,在 exec() 時會先完全複製目前的 JVM 的實體出來
導致在 Runtime.exec() 執行期間,JVM 會跟系統要求兩倍的記憶體,但是實際上可能用不到這麼多
如果這時 JVM 無法 allocate 足夠的記憶體,就會拋出記憶體不足的 Exception 了。
解法也可以參考 [1] 的討論,有一種解法是允許 memory over commit
但這顯然並不是一個完美的解法,因為允許 over commit 意思是即使系統認為記憶體不足,JVM 仍然會允許分配記憶體
當系統真的吃掉這麼多記憶體時,就會發生記憶體溢位了。
我們選擇的解法是走 JNI~透過別的東西去呼叫 Shell Script
嚴格來說也不是個漂亮的解法,但在時間有限的狀況下,也只好先這樣處理了。
參考資料:
1、Forking the JVM
沒有留言:
張貼留言