那曲檬骨新材料有限公司

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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何解決內(nèi)存溢出

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

內(nèi)存溢出(Out Of Memory,簡(jiǎn)稱(chēng)OOM)是指應(yīng)用系統(tǒng)中存在無(wú)法回收的內(nèi)存或使用的內(nèi)存過(guò)多,最終使得程序運(yùn)行要用到的內(nèi)存大于能提供的最大內(nèi)存。此時(shí)程序就運(yùn)行不了,系統(tǒng)會(huì)提示內(nèi)存溢出,有時(shí)候會(huì)自動(dòng)關(guān)閉軟件,重啟電腦或者軟件后釋放掉一部分內(nèi)存又可以正常運(yùn)行該軟件,而由系統(tǒng)配置、數(shù)據(jù)流、用戶代碼等原因而導(dǎo)致的內(nèi)存溢出錯(cuò)誤,即使用戶重新執(zhí)行任務(wù)依然無(wú)法避免

其實(shí)很簡(jiǎn)單,在 Java 中,那就是 Out Of Memory,導(dǎo)致了不合理的 GC ,那么如何去定位這個(gè)內(nèi)存溢出的呢?實(shí)際上如果是大公司,那么會(huì)有專(zhuān)業(yè)的運(yùn)維人員去定位哪些程序?qū)е铝藘?nèi)存溢出,但是如果要是沒(méi)有專(zhuān)業(yè)的運(yùn)維人員,那么你自己就得學(xué)會(huì)怎么去定位這個(gè)內(nèi)存溢出了。

如何定位內(nèi)存溢出

一、定位占用CPU最高的服務(wù) 1、先找到cpu占用比較高的進(jìn)程:top``-c 進(jìn)去后按Shift+P

一般異常的進(jìn)程cpu的占用會(huì)很高,記錄下這進(jìn)程的PID

2、查看指定進(jìn)程cpu情況:top -cp PID

查看此進(jìn)程占用cpu最高的線程,記錄下線程的ppid也可以將相關(guān)信息保存下來(lái):top -Hp PID -o %CPU -n 1 >cpu.txt到此,我們就找到的最占用cpu的進(jìn)程以及相關(guān)線程。

3.如果你已經(jīng)知道是你們的 Java 程序?qū)е铝藘?nèi)存溢出,那么我們就得學(xué)會(huì)分析日志,一般在 Out Of Memory 的上方,我們都會(huì)有各種日志的輸出,來(lái)標(biāo)志現(xiàn)在這個(gè)時(shí)間點(diǎn),我們的程序執(zhí)行了什么操作,導(dǎo)致了我們的這個(gè)內(nèi)存溢出,分析到這里,就輪到看代碼了。

檢查的內(nèi)容大致都有哪些地方呢?

在一個(gè)項(xiàng)目中,使用兩個(gè)數(shù)據(jù)庫(kù)連接,其中專(zhuān)用于發(fā)送短信的數(shù)據(jù)庫(kù)連接使用 DBCP 連接池管理,用戶為不將短信發(fā)出,有意將數(shù)據(jù)庫(kù)連接用戶名改錯(cuò),使得日志中有許多數(shù)據(jù)庫(kù)連接異常的日志,一段時(shí)間后,就出現(xiàn) OutOfMemory 錯(cuò)誤。經(jīng)分析,這是由于 DBCP 連接池 BUG 引起的,數(shù)據(jù)庫(kù)連接不上后,沒(méi)有將連接釋放,最終使得D BCP 報(bào)OutOfMemory 錯(cuò)誤。

上面這是一個(gè)簡(jiǎn)單的例子,比如還有其他的,代碼中是否有死循環(huán)或遞歸調(diào)用。是否有大循環(huán)重復(fù)產(chǎn)生新對(duì)象實(shí)體。檢查對(duì)數(shù)據(jù)庫(kù)查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來(lái)說(shuō),如果一次取十萬(wàn)條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個(gè)問(wèn)題比較隱蔽,在上線前,數(shù)據(jù)庫(kù)中數(shù)據(jù)較少,不容易出問(wèn)題,上線后,數(shù)據(jù)庫(kù)中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對(duì)于數(shù)據(jù)庫(kù)查詢盡量采用分頁(yè)的方式查詢。

檢查List、MAP等集合對(duì)象是否有使用完后,未清除的問(wèn)題。List、MAP等集合對(duì)象會(huì)始終存有對(duì)對(duì)象的引用,使得這些對(duì)象不能被GC回收。

比如我們這次內(nèi)存溢出,就是因?yàn)橐粋€(gè)很簡(jiǎn)答的導(dǎo)入功能,因?yàn)榉?wù)器給服務(wù)拆分的內(nèi)存只有2G,而程序也沒(méi)有專(zhuān)門(mén)的去處理,實(shí)施導(dǎo)入數(shù)據(jù)的時(shí)候,直接把100w的空數(shù)據(jù)從Excel中直接導(dǎo)入了,結(jié)果,直接導(dǎo)致了內(nèi)存溢出。那么我們應(yīng)該怎么去處理這個(gè)呢?

其實(shí)我們的比較簡(jiǎn)單,就是直接限定了文件的大小,因?yàn)?code>Excel 雖然很大,但是有數(shù)據(jù)量的就那么幾百行,100w行,都是空行數(shù)據(jù),還都識(shí)別了,所以處理方式就那么幾種,限制文件大小,限制讀取數(shù)據(jù)的時(shí)候不讀空行,因?yàn)楫吘箖?nèi)存大小是已經(jīng)不允許我們做修改了,只能通過(guò)這個(gè)代碼業(yè)務(wù)層面來(lái)處理這個(gè)了。

如何解決內(nèi)存溢出呢?

內(nèi)存溢出的解決方案:

第一步,修改JVM啟動(dòng)參數(shù),直接增加內(nèi)存。(-Xms-Xmx參數(shù)一定不要忘記加。)

第二步,檢查錯(cuò)誤日志,查看OutOfMemory錯(cuò)誤前是否有其它異?;蝈e(cuò)誤。

第三步,對(duì)代碼進(jìn)行走查和分析,找出可能發(fā)生內(nèi)存溢出的位置。

重點(diǎn)排查以下幾點(diǎn):

1.檢查對(duì)數(shù)據(jù)庫(kù)查詢中,是否有一次獲得全部數(shù)據(jù)的查詢。一般來(lái)說(shuō),如果一次取十萬(wàn)條記錄到內(nèi)存,就可能引起內(nèi)存溢出。這個(gè)問(wèn)題比較隱蔽,在上線前,數(shù)據(jù)庫(kù)中數(shù)據(jù)較少,不容易出問(wèn)題,上線后,數(shù)據(jù)庫(kù)中數(shù)據(jù)多了,一次查詢就有可能引起內(nèi)存溢出。因此對(duì)于數(shù)據(jù)庫(kù)查詢盡量采用分頁(yè)的方式查詢。

2.檢查代碼中是否有死循環(huán)或遞歸調(diào)用。

3.檢查是否有大循環(huán)重復(fù)產(chǎn)生新對(duì)象實(shí)體。

4.檢查List、MAP等集合對(duì)象是否有使用完后,未清除的問(wèn)題。List、MAP等集合對(duì)象會(huì)始終存有對(duì)對(duì)象的引用,使得這些對(duì)象不能被GC回收。

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

圖片

一般的,使用的工具有很多,MAT(Memory Analyzer Tool) 這個(gè)工具是一個(gè)比較好用的分析內(nèi)存的工具,還有 jmeter 這個(gè)壓力測(cè)試工具,可對(duì)特定接口進(jìn)行壓測(cè),分析tps、響應(yīng)時(shí)間、CPU、內(nèi)存等性能指標(biāo)。

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

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

    關(guān)注

    68

    文章

    10902

    瀏覽量

    213007
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3055

    瀏覽量

    74327
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3795

    瀏覽量

    81406
  • 數(shù)據(jù)流
    +關(guān)注

    關(guān)注

    0

    文章

    121

    瀏覽量

    14437
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    19756
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    內(nèi)存溢出的原因以及解決方法

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

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

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

    linux的Tomcat內(nèi)存溢出怎么解決

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

    內(nèi)存泄露和內(nèi)存溢出是什么意思

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

    java內(nèi)存溢出排查方法解析

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

    單片機(jī)的存儲(chǔ)器內(nèi)存溢出的問(wèn)題應(yīng)該如何解

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

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

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

    三分鐘搞定MCU內(nèi)存溢出

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

    C語(yǔ)言的哪些函數(shù)會(huì)導(dǎo)致內(nèi)存溢出?如何改進(jìn)?

    這幾個(gè)函數(shù),要說(shuō)跟內(nèi)存溢出沒(méi)有關(guān)系的,只有strcmp。
    的頭像 發(fā)表于 08-01 17:06 ?1490次閱讀
    C語(yǔ)言的哪些函數(shù)會(huì)導(dǎo)致<b class='flag-5'>內(nèi)存</b><b class='flag-5'>溢出</b>?如何改進(jìn)?

    java內(nèi)存溢出的幾種原因和解決辦法

    Java是一種使用垃圾回收機(jī)制的編程語(yǔ)言,由于自動(dòng)內(nèi)存管理機(jī)制的存在,Java程序中發(fā)生內(nèi)存溢出(Out of Memory)錯(cuò)誤的情況相對(duì)較少。然而,雖然Java垃圾回收器負(fù)責(zé)釋放無(wú)用的對(duì)象占用
    的頭像 發(fā)表于 11-23 14:44 ?6274次閱讀

    java內(nèi)存溢出排查方法

    Java內(nèi)存溢出(Memory overflow)是指Java虛擬機(jī)(JVM)中的堆內(nèi)存無(wú)法滿足對(duì)象分配的需求,導(dǎo)致程序拋出OutOfMemoryError異常。內(nèi)存
    的頭像 發(fā)表于 11-23 14:46 ?3342次閱讀

    jvm內(nèi)存溢出故障排查

    JVM內(nèi)存溢出是常見(jiàn)且令人頭疼的問(wèn)題,特別是在運(yùn)行大型Java應(yīng)用程序或長(zhǎng)時(shí)間運(yùn)行的應(yīng)用程序時(shí)。當(dāng)JVM分配給應(yīng)用程序的內(nèi)存不足以處理應(yīng)用程序所需的數(shù)據(jù)時(shí),就會(huì)發(fā)生內(nèi)存
    的頭像 發(fā)表于 12-05 11:04 ?891次閱讀

    jvm內(nèi)存溢出該如何定位解決

    在Java應(yīng)用程序中,JVM(Java虛擬機(jī))內(nèi)存溢出是指Java應(yīng)用程序試圖分配的內(nèi)存超過(guò)了JVM所允許的最大內(nèi)存大小,導(dǎo)致程序無(wú)法正常執(zhí)行。內(nèi)存
    的頭像 發(fā)表于 12-05 11:05 ?1380次閱讀

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

    內(nèi)存溢出內(nèi)存泄漏:定義、區(qū)別與解決方案? 內(nèi)存溢出內(nèi)存泄漏是計(jì)算機(jī)科學(xué)中常見(jiàn)的問(wèn)題,在開(kāi)發(fā)和
    的頭像 發(fā)表于 12-19 14:10 ?2995次閱讀

    虛擬內(nèi)存溢出該怎么處理 虛擬內(nèi)存在服務(wù)器中的應(yīng)用

    在現(xiàn)代計(jì)算機(jī)系統(tǒng)中,虛擬內(nèi)存是一種重要的資源管理技術(shù),它允許系統(tǒng)使用硬盤(pán)空間來(lái)擴(kuò)展物理內(nèi)存的容量。然而,當(dāng)系統(tǒng)運(yùn)行的程序和進(jìn)程超出了物理內(nèi)存和虛擬內(nèi)存的總?cè)萘繒r(shí),就會(huì)出現(xiàn)虛擬
    的頭像 發(fā)表于 12-04 09:49 ?278次閱讀
    百家乐官网相对策略| 百家乐官网决战推筒子| 新郑市| 鸿盛博娱乐| 鸿博娱乐城| 娱乐城源码| 大发888在线娱乐| 大发888手机| 水果机榨汁机| 全讯网开奖| 缅甸赌场| 百家乐轮盘一体机厂家| 飞天百家乐的玩法技巧和规则| 百家乐入庄闲概率| 百家乐tt娱乐场| 百家乐代理条件| 赌场百家乐信誉| 百家乐连长| 百家乐怎么押钱| 百家乐澳门百家乐| 百家乐三多注码法| 博坊百家乐官网游戏| 百家乐官网游戏运营| 亳州市| 百家乐官网赔率技巧| 百家乐官网作弊手段| 邯郸百家乐官网园真钱区| 百家乐官网现金网平台排名| 百家乐官网娱乐注册就送| 真人百家乐官网策略| 哪个百家乐官网网站信誉好| 粤港澳百家乐官网娱乐网| 网上有百家乐官网玩吗| 送现金百家乐官网的玩法技巧和规则| 娱乐网百家乐官网的玩法技巧和规则 | 专业百家乐官网分析| 百家乐官网为什么庄5| 百家乐官网现金网平台排名| 百家乐官网庄闲的比例| 新利百家乐官网的玩法技巧和规则| 百家乐官网玩法介|