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

Java詳解線上內存暴漲問題定位和解決方案

 更新時間:2021年10月29日 11:15:43   作者:該用戶快成仙了  
本篇文章介紹了我在開發(fā)過程中遇到的線上內存暴漲的問題,以及定位問題原因和解決該問題的過程及思路,通讀本篇對大家的學習或工作具有一定的價值,需要的朋友可以參考下

前因:

因為REST規(guī)范,定義資源獲取接口使用GET請求,參數(shù)拼接在url上。

如果按上述定義,當參數(shù)過長,超過tomcat默認配置 max-http-header-size :8kb

會報一下錯誤信息:

Request header is too large

可以修改springboot配置,調整請求頭大小

server: 
    max-http-header-size: xxx  

后果:

如果max-http-header-size設置過大,會導致接口吞吐下降,jvm oom,內存泄漏。

因為tomcat 會用HeapByteBuffer 預分配請求頭內存大小,在堆上分配。

線上內存暴漲問題定位和解決

請求和響應都是一樣的配置,每次請求處理預先分配,2倍配置值內存大小在 jvm 堆中

請求過多,導致線上內存暴漲,老年代有3GB多。使用jmap dump線上內存數(shù)據(jù),使用 JProfiler 分析。

線上內存暴漲問題定位和解決

線上內存暴漲問題定位和解決

符合配置大小和源碼對象

線上內存暴漲問題定位和解決

數(shù)組有3GB,和老年代和eden區(qū)總和大小相近。


-XX:PretenureSizeThreshold jvm參數(shù)用來設置默認值,當數(shù)組或對象大小超過這個設定值,直接在 Old Gen 老年代分配;默認值0,當超過eden區(qū)的大小的時候,直接分配到old區(qū)。

使用 java -XX:+PrintCommandLineFlags -version

線上內存暴漲問題定位和解決

發(fā)現(xiàn)并沒有使用
-XX:PretenureSizeThreshold參數(shù),所以是

max-http-header-size設置過大,eden區(qū)分配不夠,直接分配到old區(qū),堆區(qū)內存不夠,自動擴容,導致old區(qū)數(shù)據(jù)越來越多,頻繁觸發(fā)FullGC。

JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。默認空余堆內存小 于40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大于70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、 -Xmx相等以避免在每次GC后調整堆的大小。

線上內存暴漲問題定位和解決

線上內存暴漲問題定位和解決

線上內存暴漲問題定位和解決

其中http-nio-9005-exec-線程有146個,和前面配置需要分配的20M內存請求,相乘的數(shù)據(jù)與3000MB相近。

線上內存暴漲問題定位和解決

tomcat任務線程池 最大線程數(shù)200,存活時間60s

線上內存暴漲問題定位和解決

因為TaskQueue 重寫了offer方法,在線程池大小小于最大線程數(shù)時,任務不會放入任務隊列,只會交給現(xiàn)有線程執(zhí)行;存活時間60s,只有當線程空閑60s才會被回收,也就是**60秒內請求要小于當前線程數(shù),**才會有空閑線程。這就導致了線程不能及時被回收。請求數(shù)下降,但是內存還是居高不下。

解決方案:

max-http-header-size修改為默認值,接口請求方式修改為POST,請求參數(shù)放置于body

到此這篇關于Java詳解線上內存暴漲問題定位和解決方案的文章就介紹到這了,更多相關Java 內存暴漲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論