1. 程式人生 > >記一次java程序內存溢出問題

記一次java程序內存溢出問題

大文本 啟動 充足 嘗試 b-s 分析 無法 都是 root

一個自然語言處理程序,在封裝為web-service後,部署到線上運行。

但最近出現了內存溢出的情況,頻繁的out of memory。

先盲目嘗試在啟動腳本中增加-XX:-UseGCOverheadLimit。

因為根據原因未找到,依然頻繁的out of memory,只能一直觀察jstat -gcutil <pid>,看到老生代內存降不下來時,重啟程序。

服務程序很簡單,簡單接收參數,自然語言處理,返回數據,除了自然語言處理模塊,都是方法參數,不會出現內存泄漏的情況。

第一次解決這種內存溢出的問題,沒有太大頭緒。一直知道java 可以把內存dump下來,於是試著用mat分析內存。

分析內存時,直接查看dominator tree即可,這時查看的是所有root引用的實例,那個實例內存占用異常一目了然。

通過此種方式找到了內存溢出的原因:

有服務請求者發送的文本長達10萬字,自然語言處理模塊創建了大量的變量,占用了大量的內存,加之大文本的分析緩慢,占用的內存一直未釋放,導致後續數據處理時無法獲得充足的內存。

此時再來一個大文本,服務就掛了。

13333333333333~

記一次java程序內存溢出問題