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

Java堆空間爆滿導致宕機的問題分析及解決

 更新時間:2024年02月02日 08:54:33   作者:movee  
團隊有一個服務,一直運行的好好的,突然訪問異常了,先是請求超時,然后直接無法訪問,本文將給大家介紹Java堆空間爆滿導致宕機的問題分析及解決,需要的朋友可以參考下

1 問題現(xiàn)象與定位

團隊有一個服務,一直運行的好好的,突然訪問異常了,先是請求超時,然后直接無法訪問。接到問題反饋后,首先想到的是查看日志,日志中沒有任何程序邏輯處理錯誤的日志,但是接口請求處理的時間拉的特別的長,且訪問外部接口都報超時了。

同一個接口處理時間對比如下:

2024-01-25 00:03:44.451 [http-nio-8843-exec-7] INFO  c.b.w.o.api.v1.ApiControllerV1 - 2410710a-17ec-49ce-a74e-23e410189b08 clientRealIp: 10.181.202.12, finish getStatus, duration time: 634 ms
2024-01-25 02:29:38.707 [http-nio-8843-exec-105] INFO  c.b.w.o.a.a.BasicApiExceptionHandler - 3f3b24ef-b1c0-4558-ad15-ec88b30aa0bd clientRealIp: 10.181.200.33, finish getStatus, duration time: 1217935 ms

eureka client周期性打印以下日志:

2024-01-25 01:00:59.823 [DiscoveryClient-1] WARN  c.n.discovery.TimedSupervisorTask -  task supervisor timed out
java.util.concurrent.TimeoutException: null
	at java.util.concurrent.FutureTask.get(FutureTask.java:205)
	at com.netflix.discovery.TimedSupervisorTask.run(TimedSupervisorTask.java:66)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

訪問數(shù)據(jù)庫的連接異常斷開:

2024-01-25 01:12:21.965 [http-nio-8843-exec-13] WARN  c.zaxxer.hikari.pool.ProxyConnection - d0487d3e-89cf-4385-ae59-6d26ff1e277a HikariPool-1 - Connection com.mysql.jdbc.JDBC4Connection@2b165bf4 marked as broken because of SQLSTATE(08007), ErrorCode(0)
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during commit(). Transaction resolution unknown.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
	at com.mysql.jdbc.Util.getInstance(Util.java:360)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:935)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:924)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:870)
	at com.mysql.jdbc.ConnectionImpl.commit(ConnectionImpl.java:1611)
	at com.zaxxer.hikari.pool.ProxyConnection.commit(ProxyConnection.java:361)
	at com.zaxxer.hikari.pool.HikariProxyConnection.commit(HikariProxyConnection.java)

調(diào)用外部接口報錯:

2024-01-25 01:12:22.148 [http-nio-8843-exec-3] ERROR c.b.w.o.a.a.BasicApiExceptionHandler - 7c4a2b46-dc8a-4121-85ff-cf25ec16a17d org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.OutOfMemoryError: Java heap space
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.web.trace.servlet.HttpTraceFilter.doFilterInternal(HttpTraceFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at com.baidu.wuyou.operation.api.aspect.CachingRequestBodyFilter.doFilterInternal(CachingRequestBodyFilter.java:25)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:94)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.filterAndRecordMetrics(WebMvcMetricsFilter.java:114)
	at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:104)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.OutOfMemoryError: Java heap space
	at com.fasterxml.jackson.core.util.BufferRecycler.calloc(BufferRecycler.java:191)
	at com.fasterxml.jackson.core.util.BufferRecycler.allocCharBuffer(BufferRecycler.java:161)
	at com.fasterxml.jackson.core.util.BufferRecycler.allocCharBuffer(BufferRecycler.java:151)
	at com.fasterxml.jackson.core.io.IOContext.allocConcatBuffer(IOContext.java:234)
	at com.fasterxml.jackson.core.json.UTF8JsonGenerator.<init>(UTF8JsonGenerator.java:139)
	at com.fasterxml.jackson.core.JsonFactory._createUTF8Generator(JsonFactory.java:1817)
	at com.fasterxml.jackson.core.JsonFactory.createGenerator(JsonFactory.java:1281)

上面這條日志很“友好”的說明出錯的原因是java.lang.OutOfMemoryError: Java heap space,立即查看應用程序的堆監(jiān)控,顯示堆空間爆滿而宕機了,監(jiān)控圖如下所示:

現(xiàn)在就是要確定具體是哪個地方導致內(nèi)存占用飆升了,幸虧項目設(shè)置了如下配置,當程序異常宕機時會dump堆空間快照。

JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError"
JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=${LOG_DIR}/${PROJ_NAME}-`date +%s`-pid$$.hprof"
JVM_OPTS="$JVM_OPTS -Xloggc:${LOG_DIR}/${PROJ_NAME}-gc.log"
JVM_OPTS="$JVM_OPTS -XX:ErrorFile=${LOG_DIR}/${PROJ_NAME}-`date +%s`-pid%p.log"

馬上用MATMemoryAnalyzer)工具查看heap dump數(shù)據(jù),終于找到了罪魁禍首,如下所示:

2 問題原因分析

導致內(nèi)存爆滿的地方的核心功能是從多個數(shù)據(jù)源獲取數(shù)據(jù),然后提供給grafana進行大屏展示(基于simplejson插件)。同時,grafana大屏數(shù)據(jù)會自動周期性刷新。當在一個panel內(nèi)展示的曲線比較多,且展示的時間范圍比較大,同時需要展示的panel數(shù)也較多時,導致該數(shù)據(jù)處理邏輯處理不過來,上一個刷新周期還沒有處理完,下一個刷新周期的請求又到了,同時java heap空間設(shè)置的也不足夠大,導致heap空間占用累積上升,jvm一直忙于STWStop The World)式垃圾收集,直到最終宕機

3 問題修復與優(yōu)化方法

通過這次故障,發(fā)現(xiàn)這個模塊看上去處理邏輯比較簡單,但是仍然暴露了不少設(shè)計上的問題,分別采用了一些優(yōu)化方法:

  • 首先當然是增加heap空間大小,畢竟能多撐一會兒是一會兒

  • 梳理處理邏輯時,發(fā)現(xiàn)性能仍然有提升空間,通過提升性能,減少數(shù)據(jù)處理時間,讓內(nèi)存盡快釋放

  • 請求外部數(shù)據(jù)接口和等待并發(fā)任務完成時,為避免掛死,都設(shè)置了超時時間,原先為了盡量能獲取到數(shù)據(jù)(外部接口有時確實返回也比較慢),設(shè)置的超時時間比較長,降低超時時間(消除隱患)

  • 限制單個pannel的最大曲線數(shù),限制最大展示時間窗口大小

  • 增量獲取數(shù)據(jù)

  • 將該功能獨立為單獨的微服務,不與其他邏輯放在一個服務中(作為獨立的微服務,也不會增加調(diào)用鏈長度)

  • 優(yōu)化原先的數(shù)據(jù)結(jié)構(gòu)。

    原先的數(shù)據(jù)結(jié)構(gòu)為:

public class Avail {
    private Long total;
    private Integer loss;
    private Double latency;
    private Double rate;
}

改為:

public class Avail {
    private long total;
    private int loss;
    private double latency;
    private double rate;
}

這樣一個數(shù)據(jù)點可以節(jié)約16字節(jié)(不壓縮對象指針)或8字節(jié)(壓縮對象指針),這樣一個數(shù)據(jù)點可以節(jié)約內(nèi)存約50%~67%

到此這篇關(guān)于Java堆空間爆滿導致宕機的問題分析及解決的文章就介紹到這了,更多相關(guān)Java堆空間爆滿導致宕機內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Spring中基于Java類進行配置的完整步驟

    在Spring中基于Java類進行配置的完整步驟

    基于Java配置選項,可以編寫大多數(shù)的Spring不用配置XML,下面這篇文章主要給大家介紹了關(guān)于在Spring中基于Java類進行配置的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • Java純代碼實現(xiàn)導出pdf

    Java純代碼實現(xiàn)導出pdf

    在項目開發(fā)中,產(chǎn)品的需求越來越奇葩啦,開始文件下載都是下載為excel的,做著做著需求竟然變了,要求能導出pdf,所以本文就來用Java實現(xiàn)導出pdf功能吧
    2023-12-12
  • idea上提交項目到gitee 最后出現(xiàn) Push rejected的問題處理方法

    idea上提交項目到gitee 最后出現(xiàn) Push rejected的問題處理方法

    這篇文章主要介紹了idea上面提交項目到gitee 最后出現(xiàn) Push rejected的問題處理方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • idea項目結(jié)構(gòu)中不顯示out文件夾的解決

    idea項目結(jié)構(gòu)中不顯示out文件夾的解決

    本文通過圖片的方式詳細解釋操作步驟,使讀者能夠更直觀更方便地理解和執(zhí)行操作,同時,文章末尾祝福讀者步步高升,一帆風順,展現(xiàn)了作者的人情味和親和力,整體來說,這是一篇簡單易懂、實用性強的操作指南
    2024-10-10
  • java中對象轉(zhuǎn)json字符串的三種常用方式

    java中對象轉(zhuǎn)json字符串的三種常用方式

    本文主要介紹了java中對象轉(zhuǎn)json字符串的三種常用方式,包含Jackson庫,Gson庫和Hutool工具類這三種,具有一定的參考價值,感興趣的可以了解一下
    2024-06-06
  • Java中獲取時間戳的三種方式對比實現(xiàn)

    Java中獲取時間戳的三種方式對比實現(xiàn)

    這篇文章主要介紹了Java中獲取時間戳的三種方式對比實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • java方法及this關(guān)鍵字原理分析詳解

    java方法及this關(guān)鍵字原理分析詳解

    本篇文章主要講解了對java方法和this關(guān)鍵字的用法及原理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2021-10-10
  • MyBatis查詢返回Map示例代碼

    MyBatis查詢返回Map示例代碼

    這篇文章主要給大家介紹了關(guān)于MyBatis查詢返回Map的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-10-10
  • Java下Struts框架中的ActionForm類詳解

    Java下Struts框架中的ActionForm類詳解

    這篇文章主要介紹了Java下Struts框架中的ActionForm類詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java多種經(jīng)典排序算法(含動態(tài)圖)

    Java多種經(jīng)典排序算法(含動態(tài)圖)

    排序算法是老生常談的了,但是在面試中也有會被問到,例如有時候,在考察算法能力的時候,不讓你寫算法,就讓你描述一下,某個排序算法的思想以及時間復雜度或空間復雜度。我就遇到過,直接問快排的,所以這次我就總結(jié)梳理一下經(jīng)典的十大排序算法以及它們的模板代碼
    2021-04-04

最新評論