精品一区二区三区在线成人,欧美精产国品一二三区,Ji大巴进入女人66h,亚洲春色在线视频

一次非常典型的 JVM OOM 事故

開發 前端
我解決過內存溢出的套路,雖然很糙,但很實用,比如曾經幫助藝龍支付團隊解決過訂單查詢內存溢出問題、西南某航空公司用戶中心內存溢出問題等等。

當面對 JVM OOM 時,你會緊張嗎 ? 會不會手足無措 ?

這篇文章,分享前段時間幫一位同學梳理面對 JVM OOM 事故時的解題思路。

圖片圖片

首先從對話中,我們可以看到內存溢出呈現兩種情況:

  • 運行一段時間之后,CPU 飆高 ;
  • 服務假死,表現出來日志沒有任何輸出。

我的第一反應是:非常明顯的 JVM 內存溢出表現 ,不過不知道是爆炸性的內存增長,還是緩慢的內存增長。

于是,我回復:可以每隔一段時間 觀察 top -p Pid (進程號) 看看應用的內存占用情況。

類似的效果見下圖:

圖片圖片

接下來,我讓他通過 jstat -gcutil pid 1000 看看 gc 的頻率 。

圖片圖片

從圖中,新生代 E 區和老年代基本都滿了 ,我基本可以確定是海量大對象產生導致 JVM OOM 了。

圖片圖片

定時任務這四個字如電光火石般在我眼前閃過,基本八九不離十了。

圖片圖片

接下來,他發了張那段時間的監控圖:

圖片圖片

哇,這張圖太有畫面感了,我都能感覺到 GC 線程在四處滅火,但依然無法釋放內存的彷徨。

最后,我有點擔心,是不是 JVM 內存分配小了才導致 OOM 了,同學的回復是 : 12 G 。

我覺得內存大小還可以 ,一般情況下通過 jmap -heap pid 來查看,示例圖如下:

圖片圖片

分析到這里,基本上我得到了如下的結論:

1、要查看代碼中是否有一次性查詢海量對象的操作 ;

2、或者有什么公共的對象一直在使用,而忘記了釋放;

3、12 G 對一般的小應用來講是綽綽有余的,而且他們的應用非高并發場景,是內網系統。

圖片圖片

最后,我建議觀察在日志停的那個時刻到底做了哪些事情,那才是真正的案發現場

那到底是什么原因導致 JVM OOM 呢 ? 和我預期的基本一模一樣:

圖片圖片

SQL 語句類似下圖,查詢條件沒有拼接好,導致全表掃描。

圖片圖片

我們總結下,解決 JVM 內存溢出問題的流程:

1、分析事故現場(CPU、內存、日志);

2、通過  top -p Pid (進程號)分析進程資源占用,判斷是爆炸性的內存增長,還是緩慢的內存增長。

3、 jstat -gcutil pid 1000 看看 gc 的頻率 ,可以分析是否有大對象產生以及 查看 GC 頻率。

4、 jmap -heap pid 分析真實的 JVM 內存占用 ,確認是否真的內存分配得太小了。

5、 事故發生當時到底做了什么,有沒有出現類似于內存或者 CPU 占用呈現脈沖飆高樣子。

6、 若有飆高的場景,分析彼時彼刻到底有哪些操作。

7、 若是緩慢增長,則考慮使用 MAT 結合排除法分析內存占用。

上面的流程是我解決過內存溢出的套路,雖然很糙,但很實用,比如曾經幫助藝龍支付團隊解決過訂單查詢內存溢出問題、西南某航空公司用戶中心內存溢出問題等等。

最后,我想說:一定要注意 where 1 = 1 哦 ,真的出現太多次啦。

責任編輯:武曉燕 來源: 勇哥Java實戰
相關推薦

2019-01-16 09:20:42

架構設計JVM FullGC宕機事故

2021-12-27 10:08:16

Python編程語言

2020-10-24 13:50:59

Python編程語言

2021-03-05 22:41:55

CDH集群CDH集群

2020-08-24 07:34:39

網絡超時請求

2022-05-12 09:52:09

網絡架構HTTP跨域保護機制

2020-11-16 12:35:25

線程池Java代碼

2022-07-11 13:58:14

數據庫業務流程系統

2023-01-16 14:49:00

MongoDB數據庫

2022-06-06 11:31:31

MySQL數據查詢

2017-11-09 09:06:29

流量暴增優化

2022-11-16 08:00:00

雪花算法原理

2021-04-13 08:54:28

dubbo線程池事故排查

2022-09-07 09:09:13

高并發架構

2022-10-25 18:00:00

Redis事務生產事故

2020-10-21 12:10:30

訂單號Java代碼

2011-06-28 10:41:50

DBA

2022-06-30 19:00:00

高可用KeepalivedLinux

2019-04-04 15:00:40

SQL索引數據庫

2020-09-25 07:57:42

生產事故系統
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 依兰县| 西和县| 砀山县| 团风县| 汉阴县| 望江县| 朝阳区| 新津县| 新巴尔虎右旗| 嘉善县| 盐源县| 融水| 汉川市| 嫩江县| 尼玛县| 娱乐| 如皋市| 汾阳市| 兴隆县| 宜黄县| 封丘县| 临泉县| 剑川县| 虎林市| 博湖县| 镶黄旗| 河池市| 广安市| 洛隆县| 嘉黎县| 开阳县| 比如县| 保康县| 上栗县| 孙吴县| 丽江市| 罗田县| 行唐县| 开阳县| 桐梓县| 嘉定区|