RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何解決內存溢出

科技綠洲 ? 來源:了不起 ? 作者:了不起 ? 2023-09-25 10:54 ? 次閱讀

內存溢出(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 BCPOutOfMemory 錯誤。

上面這是一個簡單的例子,比如還有其他的,代碼中是否有死循環(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等集合對象是否有使用完后,未清除的問題。ListMAP等集合對象會始終存有對對象的引用,使得這些對象不能被GC回收。

第四步,使用內存查看工具動態(tài)查看內存使用情況

圖片

一般的,使用的工具有很多,MAT(Memory Analyzer Tool) 這個工具是一個比較好用的分析內存的工具,還有 jmeter 這個壓力測試工具,可對特定接口進行壓測,分析tps、響應時間、CPU、內存等性能指標。

JConsoleJVisualVM jdk 自帶可視化工具,可監(jiān)控CPU、內存、線程等狀況。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10854

    瀏覽量

    211574
  • 內存
    +關注

    關注

    8

    文章

    3019

    瀏覽量

    74003
  • 程序
    +關注

    關注

    117

    文章

    3785

    瀏覽量

    81003
  • 數據流
    +關注

    關注

    0

    文章

    119

    瀏覽量

    14349
  • 線程
    +關注

    關注

    0

    文章

    504

    瀏覽量

    19675
收藏 人收藏

    評論

    相關推薦

    內存溢出的原因以及解決方法

    內存溢出 ,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數,那就是
    的頭像 發(fā)表于 06-01 11:31 ?2.4w次閱讀
    <b class='flag-5'>內存</b><b class='flag-5'>溢出</b>的原因以及解決方法

    ESP32C3藍牙m(xù)eshprovisioner出現(xiàn)內存溢出問題如何解決?

    E (226178673) BLE_MESH: bt_mesh_alloc_buf, Out of memory E (226178683) BLE_MESH: sdu_recv, Out of memory 藍牙m(xù)eshprovisioner 出現(xiàn)內存溢出問題,該如
    發(fā)表于 06-07 07:59

    linux的Tomcat內存溢出怎么解決

    Tomcat本身不能直接在計算機上運行,需要依賴于操作系統(tǒng)和一個JAVA虛擬機。JAVA程序啟動時JVM會分配一個初始內存和最大內存給程序。當程序需要的內存超出內存的最大值時虛擬機就會
    發(fā)表于 07-16 07:38

    內存泄露和內存溢出是什么意思

    面試題目匯總最重要:簡單又重點突出的自我介紹!1、內存泄露和內存溢出是什么意思2、static的使用3、break 和continue的區(qū)別4、指針函數和函數指針的區(qū)別5、數組和鏈表的區(qū)別
    發(fā)表于 12-20 07:47

    java內存溢出排查方法解析

     內存溢出(out of memory),通俗理解就是內存不夠,通常在運行大型軟件或游戲時,軟件或游戲所需要的內存遠遠超出了你主機內安裝的內存
    發(fā)表于 11-28 13:57 ?6755次閱讀

    單片機的存儲器內存溢出的問題應該如何解

    今天同事遇到一個內存溢出的問題,在幫忙解決過程中發(fā)現(xiàn)自己對這些東西還沒有徹底弄清楚,就搜集了一些資料整理一下, 受益匪淺。以前也記過筆記,但是時間一長又忘了,還是放在這里好了。
    發(fā)表于 09-11 17:24 ?8次下載
    單片機的存儲器<b class='flag-5'>內存</b><b class='flag-5'>溢出</b>的問題應該如<b class='flag-5'>何解</b>決

    內存溢出內存泄露的區(qū)別_內存溢出的原因以及解決方法

    內存溢出內存泄露的區(qū)別是什么?內存溢出怎么解決?內存溢出
    發(fā)表于 06-01 10:27 ?2912次閱讀

    三分鐘搞定MCU內存溢出

    今天我來講一講MCU開發(fā)中的一個棘手問題——內存溢出,希望能幫到遇到該問題的同學們。
    的頭像 發(fā)表于 03-26 10:07 ?1911次閱讀

    C語言的哪些函數會導致內存溢出?如何改進?

    這幾個函數,要說跟內存溢出沒有關系的,只有strcmp。
    的頭像 發(fā)表于 08-01 17:06 ?1413次閱讀
    C語言的哪些函數會導致<b class='flag-5'>內存</b><b class='flag-5'>溢出</b>?如何改進?

    java內存溢出的幾種原因和解決辦法

    Java是一種使用垃圾回收機制的編程語言,由于自動內存管理機制的存在,Java程序中發(fā)生內存溢出(Out of Memory)錯誤的情況相對較少。然而,雖然Java垃圾回收器負責釋放無用的對象占用
    的頭像 發(fā)表于 11-23 14:44 ?6166次閱讀

    java內存溢出排查方法

    Java內存溢出(Memory overflow)是指Java虛擬機(JVM)中的堆內存無法滿足對象分配的需求,導致程序拋出OutOfMemoryError異常。內存
    的頭像 發(fā)表于 11-23 14:46 ?3217次閱讀

    jvm內存溢出故障排查

    JVM內存溢出是常見且令人頭疼的問題,特別是在運行大型Java應用程序或長時間運行的應用程序時。當JVM分配給應用程序的內存不足以處理應用程序所需的數據時,就會發(fā)生內存
    的頭像 發(fā)表于 12-05 11:04 ?814次閱讀

    jvm內存溢出該如何定位解決

    在Java應用程序中,JVM(Java虛擬機)內存溢出是指Java應用程序試圖分配的內存超過了JVM所允許的最大內存大小,導致程序無法正常執(zhí)行。內存
    的頭像 發(fā)表于 12-05 11:05 ?1330次閱讀

    內存溢出內存泄漏:定義、區(qū)別與解決方案

    內存溢出內存泄漏:定義、區(qū)別與解決方案? 內存溢出內存泄漏是計算機科學中常見的問題,在開發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?2720次閱讀

    虛擬內存溢出該怎么處理 虛擬內存在服務器中的應用

    在現(xiàn)代計算機系統(tǒng)中,虛擬內存是一種重要的資源管理技術,它允許系統(tǒng)使用硬盤空間來擴展物理內存的容量。然而,當系統(tǒng)運行的程序和進程超出了物理內存和虛擬內存的總容量時,就會出現(xiàn)虛擬
    的頭像 發(fā)表于 12-04 09:49 ?135次閱讀
    RM新时代网站-首页