內存溢出(Out Of Memory
,簡稱OOM
)是指應用系統(tǒng)中存在無法回收的內存或使用的內存過多,最終使得程序運行要用到的內存大于能提供的最大內存。此時程序就運行不了,系統(tǒng)會提示內存溢出,有時候會自動關閉軟件,重啟電腦或者軟件后釋放掉一部分內存又可以正常運行該軟件,而由系統(tǒng)配置、數據流、用戶代碼等原因而導致的內存溢出錯誤,即使用戶重新執(zhí)行任務依然無法避免
其實很簡單,在 Java
中,那就是 Out Of Memory
,導致了不合理的 GC
,那么如何去定位這個內存溢出的呢?實際上如果是大公司,那么會有專業(yè)的運維人員去定位哪些程序導致了內存溢出,但是如果要是沒有專業(yè)的運維人員,那么你自己就得學會怎么去定位這個內存溢出了。
如何定位內存溢出
一、定位占用CPU
最高的服務 1、先找到cpu占用比較高的進程:top``-c
進去后按Shift+P
鍵
一般異常的進程cpu
的占用會很高,記錄下這進程的PID
2、查看指定進程cpu
情況:top -cp PID
查看此進程占用cpu
最高的線程,記錄下線程的ppid
也可以將相關信息保存下來:top -Hp PID -o %CPU -n 1 >cpu.txt
到此,我們就找到的最占用cpu
的進程以及相關線程。
3.如果你已經知道是你們的 Java
程序導致了內存溢出,那么我們就得學會分析日志,一般在 Out Of Memory
的上方,我們都會有各種日志的輸出,來標志現(xiàn)在這個時間點,我們的程序執(zhí)行了什么操作,導致了我們的這個內存溢出,分析到這里,就輪到看代碼了。
檢查的內容大致都有哪些地方呢?
在一個項目中,使用兩個數據庫連接,其中專用于發(fā)送短信的數據庫連接使用 DBCP
連接池管理,用戶為不將短信發(fā)出,有意將數據庫連接用戶名改錯,使得日志中有許多數據庫連接異常的日志,一段時間后,就出現(xiàn) OutOfMemory
錯誤。經分析,這是由于 DBCP
連接池 BUG
引起的,數據庫連接不上后,沒有將連接釋放,最終使得D BCP
報OutOfMemory
錯誤。
上面這是一個簡單的例子,比如還有其他的,代碼中是否有死循環(huán)或遞歸調用。是否有大循環(huán)重復產生新對象實體。檢查對數據庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線后,數據庫中數據多了,一次查詢就有可能引起內存溢出。因此對于數據庫查詢盡量采用分頁的方式查詢。
檢查List
、MAP
等集合對象是否有使用完后,未清除的問題。List
、MAP
等集合對象會始終存有對對象的引用,使得這些對象不能被GC
回收。
比如我們這次內存溢出,就是因為一個很簡答的導入功能,因為服務器給服務拆分的內存只有2G,而程序也沒有專門的去處理,實施導入數據的時候,直接把100w的空數據從Excel
中直接導入了,結果,直接導致了內存溢出。那么我們應該怎么去處理這個呢?
其實我們的比較簡單,就是直接限定了文件的大小,因為Excel
雖然很大,但是有數據量的就那么幾百行,100w行,都是空行數據,還都識別了,所以處理方式就那么幾種,限制文件大小,限制讀取數據的時候不讀空行,因為畢竟內存大小是已經不允許我們做修改了,只能通過這個代碼業(yè)務層面來處理這個了。
如何解決內存溢出呢?
內存溢出的解決方案:
第一步,修改JVM
啟動參數,直接增加內存。(-Xms
,-Xmx
參數一定不要忘記加。)
第二步,檢查錯誤日志,查看OutOfMemory
錯誤前是否有其它異?;蝈e誤。
第三步,對代碼進行走查和分析,找出可能發(fā)生內存溢出的位置。
重點排查以下幾點:
1.檢查對數據庫查詢中,是否有一次獲得全部數據的查詢。一般來說,如果一次取十萬條記錄到內存,就可能引起內存溢出。這個問題比較隱蔽,在上線前,數據庫中數據較少,不容易出問題,上線后,數據庫中數據多了,一次查詢就有可能引起內存溢出。因此對于數據庫查詢盡量采用分頁的方式查詢。
2.檢查代碼中是否有死循環(huán)或遞歸調用。
3.檢查是否有大循環(huán)重復產生新對象實體。
4.檢查List
、MAP
等集合對象是否有使用完后,未清除的問題。List
、MAP
等集合對象會始終存有對對象的引用,使得這些對象不能被GC
回收。
第四步,使用內存查看工具動態(tài)查看內存使用情況
一般的,使用的工具有很多,MAT
(Memory Analyzer Tool) 這個工具是一個比較好用的分析內存的工具,還有 jmeter
這個壓力測試工具,可對特定接口進行壓測,分析tps、響應時間、CPU、內存等性能指標。
JConsole
、JVisualVM
jdk 自帶可視化工具,可監(jiān)控CPU
、內存、線程等狀況。
-
cpu
+關注
關注
68文章
10854瀏覽量
211574 -
內存
+關注
關注
8文章
3019瀏覽量
74003 -
程序
+關注
關注
117文章
3785瀏覽量
81003 -
數據流
+關注
關注
0文章
119瀏覽量
14349 -
線程
+關注
關注
0文章
504瀏覽量
19675
發(fā)布評論請先 登錄
相關推薦
評論