<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一次內(nèi)存泄漏問題排查和分析,小坑

          共 1544字,需瀏覽 4分鐘

           ·

          2022-06-21 08:41

          大家好,我是小富~


          今天這篇文章帶大家分析一個內(nèi)存異常的問題。


          我們有個新服務(wù)上線運(yùn)行一段時間后,老是出現(xiàn)堆內(nèi)存不足,大量出現(xiàn) Full GC,有些實(shí)例甚至出現(xiàn)內(nèi)存溢出錯誤:

          java.lang.OutOfMemoryError: Java heap space

          但是為什么會內(nèi)存溢出呢?按說訪問量也不是很高,于是進(jìn)行了下面的排查和分析。

          1、懷疑內(nèi)存泄漏

          進(jìn)入 APM 監(jiān)控系統(tǒng)查看實(shí)例內(nèi)存情況,把時間線拉長到一天,可以看到內(nèi)存有緩慢上升趨勢,初步懷疑有內(nèi)存泄漏。

          2、Heap Dump

          獲取到機(jī)器ip,聯(lián)系運(yùn)維人員去機(jī)器上把堆dump下來,dump命令:

          /xxx/jdk1.8.0_212/bin/jmap -dump:live,format=b,file=/xxx/xxx.hprof  進(jìn)程號

          將堆dump文件 Xxx.hprof 下載到本地。

          3、下載Heap Dump分析工具

          常用的分析工具有MAT和JProfile,本文以MAT工具為示例進(jìn)行分析。工具下載鏈接如下:

          https://www.eclipse.org/mat/downloads.php

          注意:如果你本地安裝的是JDK11+,下載最新的即可;如果你本地安裝的是JDK8,建議下載1.9.2版本。

          4、將Dump文件導(dǎo)入MAT工具

          MAT是eclipse的一個插件,免安裝,雙擊打開即可使用。

          打開下載好的dump文件

          5、分析Dump文件

          打開內(nèi)存泄漏懷疑分析報告,可以看到 SessionFactoryImpl 這個對象使用了 149M內(nèi)存,占總內(nèi)存的25%,這肯定不正常。

          SessionFactoryImpl 這個類是跟數(shù)據(jù)庫相關(guān),服務(wù)代碼中使用了JPA作為持久層框架,應(yīng)該是跟JPA相關(guān),繼續(xù)往下分析。

          我們打開內(nèi)存樹,往下挖,可以看到 QueryPlanCache 這個對象占用內(nèi)存比較大。

          QueryPlanCache 表面的意思是:查詢計(jì)劃緩存。用google查一下具體含義。

          簡單來說Hibernate會緩存sql語句以減少重復(fù)編譯,便于直接命中提高效率。

          在使用 SQL in 的時候,如果 in 后的參數(shù)不同,hibernate會把其當(dāng)成不同的sql進(jìn)行緩存,從而緩存大量的sql。

          緩存的大小是多少?查了一下官方文檔,如果不配置,這個緩存默認(rèn)最大值為2048 。

          Stack Overflow上也有用戶反饋這個問題:

          https://stackoverflow.com/questions/31557076/spring-hibernate-query-plan-cache-memory-usage

          7、分析結(jié)論

          drawio服務(wù)里面有大量的 sql in 語句,in 后面的參數(shù)不一樣造成Hibernate緩存了大量SQL語句,占用大量的堆內(nèi)存。

          8、解決措施

          (1)添加配置參數(shù),限制緩存大小

          參數(shù)解釋:

          https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#configurations-query

          (2)提高 sql in 的緩存效率

          參數(shù)解釋:

          https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#configurations-query

          -- End --

          以上就是在項(xiàng)目中遇到的一些小問題,通過這個例子,希望可以幫助大家日后分析類似問題帶來一些幫助。看完如果有幫助,希望可以給個三連,你的鼓勵就是我不斷前進(jìn)的動力。

          瀏覽 90
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产喷水| 五月天色综合 | 亚洲人人操| 丁香五月色情 | 亚洲综合中文字幕在线播放 |