欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一次OOM問題排查過程實戰(zhàn)記錄

 更新時間:2019年05月02日 10:51:47   作者:lovecindywang  
這篇文章主要給大家介紹了一次OOM問題排查過程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

上周運維反饋線上程序出現(xiàn)了OOM,程序日志中的輸出為

Exception in thread "http-nio-8080-exec-1027" java.lang.OutOfMemoryError: Java heap space
Exception in thread "http-nio-8080-exec-1031" java.lang.OutOfMemoryError: Java heap space

看線程名稱應該是tomcat的nio工作線程,線程在處理程序的時候因為無法在堆中分配更多內存出現(xiàn)了OOM,幸好JVM啟動參數(shù)配置了-XX:+HeapDumpOnOutOfMemoryError,使用MAT打開拿到的hprof文件進行分析。

第一步就是打開Histogram看看占用內存最大的是什么對象:


可以看到byte數(shù)組占用了接近JVM配置的最大堆的大小也就是8GB,顯然這是OOM的原因。

第二步看一下究竟是哪些byte數(shù)組,數(shù)組是啥內容:


可以看到很明顯這和HTTP請求相關,一個數(shù)組大概是10M的大小。

第三步通過查看GC根查看誰持有了數(shù)組的引用:


這符合之前的猜測,是tomcat的線程在處理過程中分配了10M的buffer在堆上。至此,馬上可以想到一定是什么參數(shù)設置的不合理導致了這種情況,一般而言tomcat不可能為每一個請求分配如此大的buffer。

第四步就是檢查代碼里是否有tomcat或服務器相關配置,看到有這么一個配置:

max-http-header-size: 10000000

至此,基本已經確定了八九不離十就是這個不合理的最大http請求頭參數(shù)導致的問題。

到這里還有3個疑問:

  • 即使一個請求分配10M內存,堆有8GB,難道當時有這么多并發(fā)嗎?800個tomcat線程?
  • 參數(shù)只是設置了最大請求頭10M,為什么tomcat就會一次性分配這么大的buffer呢?
  • 為什么會有如此多的tomcat線程?感覺程序沒這么多并發(fā)。

先來看問題1,這個可以通過MAT在dump中繼續(xù)尋找答案。

可以打開線程視圖,搜索一下tomcat的工作線程,發(fā)現(xiàn)線程數(shù)量的確很多有401個,但是也只是800的一半:


再回到那些大數(shù)組的清單,按照堆分配大小排序,往下看:


可以發(fā)現(xiàn)除了有10008192字節(jié)的數(shù)組還有10000000字節(jié)的數(shù)組,查看引用路徑可以看到這個正好是10M的數(shù)組是output buffer,區(qū)別于之前看到的input buffer:


好吧,這就對了,一個線程分配了輸入輸出兩個buffer,占用20M內存,一共401個線程,占用8GB,所以OOM了。
還引申出一個問題為啥有這么多工作線程,

再來看看問題2,這就需要來找一下源碼了,首先max-http-header-size是springboot定義的參數(shù),查看springboot代碼可以看到這個參數(shù)對于tomcat設置的是MaxHttpHeaderSize:


然后來看看tomcat源碼:


進一步看一下input buffer:


buffer大小是MaxHttpHeaderSize+ReadBuffer大小,這個默認是8192字節(jié):

 <attribute name="socket.appReadBufSize" required="false">
  <p>(int)Each connection that is opened up in Tomcat get associated with
  a read ByteBuffer. This attribute controls the size of this buffer. By
  default this read buffer is sized at <code>8192</code> bytes. For lower
  concurrency, you can increase this to buffer more data. For an extreme
  amount of keep alive connections, decrease this number or increase your
  heap size.</p>
  </attribute>

這也就是為什么之前看到大量的buffer是10008192字節(jié)的。至于為什么分配的buffer需要是MaxHttpHeaderSize+ReadBuffer。顯然還有一批內容是空的10000000字節(jié)的buffer應該是output buffer,源碼可以印證這點:


嗯這是一個header buffer,所以正好是10000000字節(jié)。

至于問題3,顯然我們的應用程序是配置過最大線程的(查看配置后發(fā)現(xiàn)的確,我們配置為了2000,好吧有點大),否則也不會有401個工作線程(默認150),如果當時并發(fā)并不大的話就一種可能,請求很慢,雖然并發(fā)不大,但是因為請求執(zhí)行的慢就需要更多線程,比如TPS是100,但是平均RT是4s的話,就是400線程了。這個問題的答案還是可以通過MAT去找,隨便看幾個線程可以發(fā)現(xiàn)很多線程都在等待一個外部服務的返回,這說明外部服務比較慢,去搜索當時的程序日志可以發(fā)現(xiàn)有很多"feign.RetryableException: Read timed out executing的日志"。。。。追殺下游去!慢點,我們的feign的timeout也需要再去設置一下,別被外部服務拖死了。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • 淺談Android IPC機制之Binder的工作機制

    淺談Android IPC機制之Binder的工作機制

    IPC機制即為跨進程通信,是inter-Process Communication的縮寫。是指兩個進程之間進行通信。在說進程通信之前,我們的弄明白什么是線程,什么是進程。進程和線程是兩個截然不同的概念。本文將介紹Android IPC機制之Binder的工作機制。
    2021-06-06
  • 詳解Android之解析XML文件三種方式(DOM,PULL,SAX)

    詳解Android之解析XML文件三種方式(DOM,PULL,SAX)

    這篇文章主要介紹了詳解Android之解析XML文件三種方式,主要包括DOM,PULL,SAX,有興趣的可以了解一下。
    2017-02-02
  • 簡單實現(xiàn)Android鬧鐘程序 附源碼

    簡單實現(xiàn)Android鬧鐘程序 附源碼

    這篇文章主要幫助大家簡單實現(xiàn)Android鬧鐘程序,附源碼下載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-07-07
  • 安卓手機socket通信(服務器和客戶端)

    安卓手機socket通信(服務器和客戶端)

    這篇文章主要為大家詳細介紹了安卓手機socket通信,服務器和客戶端的代碼,感興趣的小伙伴們可以參考一下
    2016-08-08
  • Android編程之通知欄的用法小結

    Android編程之通知欄的用法小結

    這篇文章主要介紹了Android編程之通知欄的用法,結合實例形式總結分析了Android通知欄的相關操作技巧,包括發(fā)送、刪除通知、自定義布局等操作實現(xiàn)方法,需要的朋友可以參考下
    2017-01-01
  • Android實現(xiàn)ViewPager無限循環(huán)效果(一)

    Android實現(xiàn)ViewPager無限循環(huán)效果(一)

    這篇文章主要為大家詳細介紹了Android實現(xiàn)ViewPager無限循環(huán)效果的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • android 使用虛擬機安裝apk(圖文教程)

    android 使用虛擬機安裝apk(圖文教程)

    android 使用虛擬機安裝apk對一些新手朋友會很陌生,今天教大家使用使用虛擬機安裝apk文件,步驟很詳細,有需要的朋友可以參考下
    2012-12-12
  • 解決Android BitmapFactory的基本使用問題

    解決Android BitmapFactory的基本使用問題

    很多朋友給小編反饋使用方法BitmapFactory.decodeFile轉化Bitmap時報錯,究竟是什么原因導致錯誤問題呢?今天通過本文給大家介紹下解決Android BitmapFactory的基本使用問題,感興趣的朋友一起看看吧
    2021-10-10
  • Android實現(xiàn)的ListView分組布局改進示例

    Android實現(xiàn)的ListView分組布局改進示例

    這篇文章主要介紹了Android實現(xiàn)的ListView分組布局改進的方法,結合實例形式分析了Android針對ListView的分組布局相關操作技巧,需要的朋友可以參考下
    2016-08-08
  • Android仿新浪微博分頁管理界面(3)

    Android仿新浪微博分頁管理界面(3)

    這篇文章主要為大家詳細介紹了Android仿新浪微博分頁管理界面,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11

最新評論