成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文學會核心服務OOM!

開發 后端
原來以為內存溢出這種事情只會發生在書本上,沒想到在我們生產環境發生了,而且是618,P0事故安排上了。

[[407612]]

P0事故安排上了

原來以為內存溢出這種事情只會發生在書本上,沒想到在我們生產環境發生了,而且是618,P0事故安排上了。先回顧一下內存溢出排查的基本思路,然后再來復盤一下內存溢出發生的原因

內存溢出排查

我們先來了解一下Java堆的組成機構。對于大多數應用來說,Java堆(Java Heap)是Java虛擬機鎖管理的內存中最大的一塊。Java堆是所有線程共享的一塊內存區域,在虛擬機啟動時創建。此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存

「堆的結構如下」

「新生代老年代的具體劃分比例如下」

「分代的主要作用就是為了更高效的管理內存」

內存泄漏和內存溢出是2個不同的概念

內存泄漏:對象已經不使用了,但是還占用著內存空間,沒有被釋放 內存溢出:堆空間不夠用了,通常表現為OutOfMemoryError,內存泄漏通常會導致內存溢出

使用Java VisualVM分析排查

「我們可以通過jdk自帶的jvisualvm命令來分析堆的使用情況」

我們寫一個程序,來演示內存不斷增加的場景

  1. public class OomDemo { 
  2.  
  3.     private static final int NUM = 1024; 
  4.  
  5.     public static void main(String[] args) throws InterruptedException { 
  6.         List<byte[]> list = Lists.newArrayList(); 
  7.         for (int i = 0; i < NUM; i++) { 
  8.             TimeUnit.SECONDS.sleep(1); 
  9.             list.add(new byte[NUM * NUM]); 
  10.         } 
  11.     } 

「命令行中執行jvisualvm即可彈出圖形界面,我們可以連接到本機上的程序,也可以連接到遠程機器,還可以分析生成快照文件等」。

可以清晰的看到堆空間在不斷上漲,用抽樣器分析一下內存不斷上漲的源頭在哪里?

「好家伙,byte數組居然占用了這么多內存」

如果此時你還看不出程序哪里有問題,到監視這個Tab點擊堆Dump這個按鈕,會生成一個堆的快照,然后分析這個dump文件即可

byte數組實例很少,但是占用內存很多,再看一下具體的引用

可以看到在ArrayList中。

最后推薦一個插件Visual GC,可以清晰的看到堆的使用情況以垃圾收集信息。

點擊工具選中插件即可

當然你可以通過jmap命令生成heapdump文件,然后用其他工具分析

  1. jmap -dump:file=文件名字 進程id 

使用Eclipse Memory Analyzer分析

Java VisualVM只提供了一些基本的功能,堆中各種對象的大小和實例數。以上面的例子為例,你只能排查到ArrayList占用了大量的內存,這個ArrayList在哪,你也不知道

所以我們一般不使用Java VisualVM來分析,而是使用Eclipse Memory Analyzer來分析

Eclipse Memory Analyzer下載地址:https://www.eclipse.org/mat/downloads.php

還是上面的程序,我們啟動時設置如下參數,讓程序內存溢出時自動生成Dump文件

  1. -Xmx30m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/Users/peng 

-Xmx30m:最大堆內存為30m -XX:+HeapDumpOnOutOfMemoryError:當JVM發生OOM時,自動生成DUMP文件。-XX:HeapDumpPath:指定文件路徑,例如:-XX:HeapDumpPath=${目錄}/java_heapdump.hprof。如果不指定文件名,默認為:java_pid .hprof

生產環境一般都會配置堆溢出時自動生成DUMP文件圖片當內存溢出的時候自動生成了一個文件,java_pid28598.hprof

「用Eclipse Memory Analyzer打開這個文件,可以很清晰的看到總共使用的內存,以及各個對象占用的內存」,如下圖

總共使用的內存為26.8M Thread對象占用了26M ZoneInfoFile對象占用了157.8KB 其他對象占用了696.7KB

點擊Leak Suspects按鈕查看具體的內存泄露報告

分析出來有問題的部分只有一處(例子太簡單的緣故,很多時候會分析出來多處)

「main線程占用了97.21%的內存空間」

「點擊標紅按鈕,查看引用關系,可以很清晰的看到是由于main線程中ArrayList中放了26個byte數組造成的」

「另外可以很清晰的看到內存溢出時代碼的執行位置,排查問題非常方便」

事故復盤

先來看一下事故發生前和事故發生后JVM的情況,我們新生代用的是ParNew垃圾收集器,老年代用的是CMS垃圾收集器

13:00-13:10這段時間的情況,系統正常運行

每分鐘GC暫停時間(綠色部分是CMS,黃色部分是ParNew)

每分鐘GC次數和GC平均耗時(綠色部分是CMS,黃色部分是ParNew)

新生代和老年代的占用情況

「可以看到問題發生之前老年代已經設置的不合理了,偏小了」。

14:00-14:10這段時間的情況,14:06系統內存溢出

14:00活動開始,14:05之后每分鐘垃圾回收暫停的時間過長,都達到30s了

老年代垃圾回收的時間飆升

實在沒有可回收的了,最終老年代被占滿,內存溢出

分析dump文件

運維配置了上面說的2個參數,內存溢出時生成了dump文件,用Eclipse Memory Analyzer打開分析一波

總共1.9G,ThreadPoolExecutor占用了918.8MB,我們來看看ThreadPoolExecutor這個線程池里面到底放了些啥

分析報告指出的第一個問題就是ThreadPoolExecutor里面的東西太大了,占了總內存的47.45%了,點擊如下按鈕,查看引用鏈路

好家伙,線程池占用了900多m空間,里面用LinkedBlockingDeque存放待執行的任務

「隊列的能存放的最大數量是10000,目前放了883個任務,這個隊列的長度設置的也忒大了把!」

繼續點下去,就能看到隊列中存的具體對象,是個DTO。看包名就猜到是中間件團隊將這個DTO放到線程池中

大概邏輯如上圖,中間件團隊會通過一個agent攔截應用中方法的執行,并將入參和返回值打印在日志中,flume收集日志后給鏈路平臺,監控平臺提供數據。

方法每執行一次打印一次日志,但是日志的打印是異步化的,將參數和返回值封裝成任務,放到線程池中執行。由于618方法被高頻調用,而其中一類DTO對象很大(一個對象6,7m),任務一旦堆積,很快就是OOM。「因為隊列的最大值被設置為10000,但是當放了883個任務的時候已經OOM了」

本文轉載自微信公眾號「Java識堂」,可以通過以下二維碼關注。轉載本文請聯系Java識堂公眾號。

 

責任編輯:武曉燕 來源: Java識堂
相關推薦

2020-08-03 08:01:50

爬蟲技巧

2020-04-20 10:47:57

Redis數據開發

2021-04-30 07:33:35

效率提升技巧

2021-04-28 07:22:13

HiveJson數組

2020-08-31 06:54:37

注解脫敏ELK

2021-06-26 09:26:01

Jupyter主題目錄

2021-03-29 08:24:18

KubeadmKubernetes1運維

2021-08-04 07:47:18

IDEJTAGSWD

2025-01-14 00:00:00

場景線程數據

2021-07-30 06:51:28

Nginx運維web

2023-11-01 10:49:50

Python面向對象

2023-07-31 08:18:50

Docker參數容器

2021-04-07 08:13:28

LirbeNMS開源SNMP

2023-09-26 12:22:37

隊列Python

2019-03-21 09:45:11

TypeScript編程語言Javascript

2019-11-12 09:15:18

MySQL復制拓撲Orchestrato

2020-04-19 21:41:13

Python數據可視化

2024-09-26 09:10:08

2024-01-09 08:24:47

JMM核心線程

2019-07-26 06:29:22

MySQL數據庫SQL
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品亚洲精品日韩已方 | 国产一区二区三区免费 | 全免费a级毛片免费看视频免费下 | 五月婷亚洲 | 男女羞羞视频网站 | 99爱国产 | 日韩在线看片 | 久久综合久久久 | 婷婷毛片 | 天天摸天天干 | 亚洲成人一级 | 中文一区二区 | 亚洲综合区 | 在线午夜 | 午夜精品一区二区三区在线 | 五月天婷婷激情 | 成人视屏在线观看 | 亚洲国产精品日本 | 亚洲va中文字幕 | 羞羞视频网站免费观看 | 久草免费在线 | 精品久久一区 | www.日韩av.com| 久久成人国产精品 | 亚洲啪啪一区 | 色爱区综合| 成人在线电影网站 | 99国产精品一区二区三区 | 国产精品污污视频 | 国产一区二区三区四区三区四 | 久草青青 | 中文日本在线 | 日韩中文在线视频 | 日韩精品一区二区三区中文字幕 | 欧美一区二区视频 | 国产一区二区三区在线 | 亚洲色图50p| 欧美日韩国产一区二区 | 久久久久久久久久久久91 | 久久人人爽人人爽 | 欧美在线资源 |