最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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)

調用外部接口報錯:

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)在就是要確定具體是哪個地方導致內存占用飆升了,幸虧項目設置了如下配置,當程序異常宕機時會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 問題原因分析

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

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

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

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

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

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

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

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

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

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

    原先的數(shù)據(jù)結構為:

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é)約內存約50%~67%

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

相關文章

  • SpringBoot生成PDF的五種實現(xiàn)方法總結

    SpringBoot生成PDF的五種實現(xiàn)方法總結

    這篇文章主要介紹了SpringBoot生成PDF的五種實現(xiàn)方法,在開發(fā)中經常會遇到需要進行對一些數(shù)據(jù)進行動態(tài)導出PDF文件,然后讓用戶自己選擇是否需要打印出來,這篇文章我們來介紹五種實現(xiàn)方法,需要的朋友可以參考下
    2024-10-10
  • java中&和&&的基本區(qū)別與常見的誤用

    java中&和&&的基本區(qū)別與常見的誤用

    &?和&&是Java中用于邏輯運算的兩個運算符,&是按位與和邏輯與兼用的運算符,而&&僅用于邏輯與運算,并具有短路特性,這篇文章主要介紹了java中&和&&的基本區(qū)別與常見的誤用,需要的朋友可以參考下
    2025-02-02
  • Java自定義Spring配置標簽

    Java自定義Spring配置標簽

    這篇文章主要介紹了Java自定義Spring配置標簽,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下
    2022-08-08
  • springboot序列化和反序列化器配置方法

    springboot序列化和反序列化器配置方法

    這篇文章主要介紹了springboot序列化和反序列化器配置方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • MapReduce2框架的原理解析

    MapReduce2框架的原理解析

    這篇文章主要圍繞MapReduce2框架原理介紹的,文中有詳細的代碼示例,對學習有一定的幫助,需要的朋友可以借鑒參考
    2023-04-04
  • 快速上手Mybatis-plus結構構建過程

    快速上手Mybatis-plus結構構建過程

    這篇文章主要介紹了快速上手Mybatis-plus結構構建過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java 自定義類比較器代碼

    java 自定義類比較器代碼

    這篇文章主要介紹了java 自定義類比較器代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • mybatis plus generator 根據(jù)數(shù)據(jù)庫自動生成實體類的實現(xiàn)示例

    mybatis plus generator 根據(jù)數(shù)據(jù)庫自動生成實體類的實現(xiàn)示例

    本文主要介紹了mybatis plus generator 根據(jù)數(shù)據(jù)庫自動生成實體類的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C#創(chuàng)建Web應用程序代碼實例

    C#創(chuàng)建Web應用程序代碼實例

    本文主要通過實例代碼介紹了C#創(chuàng)建Web應用程序,需要的朋友可以參考下
    2017-04-04
  • Java 分割字符串詳解及實例代碼

    Java 分割字符串詳解及實例代碼

    這篇文章主要介紹了 Java 分割字符串詳解及實例代碼的相關資料,需要的朋友可以參考下
    2016-12-12

最新評論

旬邑县| 临夏市| 定陶县| 成武县| 井研县| 永胜县| 阆中市| 平利县| 唐海县| 阳东县| 临颍县| 日照市| 城市| 水城县| 开原市| 沛县| 宝清县| 罗城| 班玛县| 宣化县| 临沧市| 长沙市| 蒙城县| 任丘市| 濮阳县| 巨鹿县| 株洲市| 白银市| 淳化县| 广安市| 淮安市| 长岭县| 巧家县| 河津市| 兴化市| 神农架林区| 尖扎县| 都昌县| 龙川县| 库尔勒市| 盐边县|