溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

面試雜談 - 內(nèi)存泄漏如何排查

發(fā)布時(shí)間:2020-07-09 03:51:15 來源:網(wǎng)絡(luò) 閱讀:481 作者:Java_老男孩 欄目:編程語言

Java的垃圾回收機(jī)制給了程序猿便利,我們可以不需要顯式釋放資源。但想高枕無憂卻是不能,OOM像個(gè)隱藏在暗處的幽(hua)靈(nong),威脅著可憐、弱小又漂亮的程序猿。

一般來說,一個(gè)健康的程序,它是不應(yīng)該出現(xiàn)OOM的。內(nèi)存里的對(duì)象從生到死,井然有序。但由于一些人為的失誤,往往會(huì)讓一些對(duì)象逃過GC的制裁,跳出GC外,不在垃圾中。這個(gè)時(shí)候,內(nèi)存泄漏就發(fā)生了。

內(nèi)存泄露,是指程序在申請(qǐng)內(nèi)存并且用完這塊內(nèi)存后(對(duì)象不再需要了),沒有釋放已申請(qǐng)的內(nèi)存空間。少數(shù)偶然的內(nèi)存泄漏,雖然不太好,但問題不大,我們也不至于對(duì)那點(diǎn)內(nèi)存摳摳搜搜的。但如果是內(nèi)存不斷泄漏,直到新的對(duì)象沒有足夠的空間生成,就會(huì)導(dǎo)致OOM。

什么時(shí)候可能內(nèi)存泄漏

拋出OOM異常

當(dāng)程序拋出OutOfMemoryError,如果你自認(rèn)不是太摳,給了這個(gè)程序足夠的空間,那么可以懷疑有內(nèi)存泄漏

內(nèi)存持續(xù)上升

一個(gè)健康的程序應(yīng)該有平穩(wěn)的新陳代謝,內(nèi)存占用應(yīng)該維持在一定范圍。但如果內(nèi)存持續(xù)飆升,甚至到達(dá)了一個(gè)危險(xiǎn)的值,那么可以懷疑有內(nèi)存泄漏。

查看GC情況

首先獲取到應(yīng)用的pid,可以使用java的jps命令,或者ps -ef|grep 應(yīng)用名關(guān)鍵詞

可以看到Eden(E)持續(xù)造對(duì)象,并且滿了之后,老年代(O)增加,E區(qū)騰空后繼續(xù)造對(duì)象。(程序多執(zhí)行一段時(shí)間,或者造對(duì)象速度提快點(diǎn),最終會(huì)拋出OOM)

查看存活對(duì)象

根據(jù)存活對(duì)象的不正常增長(zhǎng)情況,分析程序中哪些地方用到了這種對(duì)象,也可以大致推斷出可能的內(nèi)存泄漏處。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI