1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        記一次現(xiàn)網(wǎng)內(nèi)存泄漏問(wèn)題排查和分析

        共 1909字,需瀏覽 4分鐘

         ·

        2022-02-11 11:04

        大家好,我是雷小帥!大家春節(jié)過(guò)得咋樣,反正我是挺崩潰的。本來(lái)給自己列了好多計(jì)劃,最終的執(zhí)行效果是這樣的:

        • 寫幾篇技術(shù)文章
        • 看幾本技術(shù)書籍
        • 爽快玩了幾天,走親戚,看電影

        哈哈,既然過(guò)年沒(méi)好好學(xué)習(xí),那只有熬夜趕作業(yè)了。

        今天這篇文章帶大家分析一個(gè)內(nèi)存異常的問(wèn)題,也算是新年的第一篇技術(shù)文章了,開(kāi)工大吉~~~


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

        java.lang.OutOfMemoryError: Java heap space

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

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

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

        2、Heap Dump

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

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

        將堆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的一個(gè)插件,免安裝,雙擊打開(kāi)即可使用。

        打開(kāi)下載好的dump文件

        5、分析Dump文件

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

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

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

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

        簡(jiǎn)單來(lái)說(shuō)Hibernate會(huì)緩存sql語(yǔ)句以減少重復(fù)編譯,便于直接命中提高效率。

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

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

        Stack Overflow上也有用戶反饋這個(gè)問(wèn)題:

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

        7、分析結(jié)論

        drawio服務(wù)里面有大量的 sql in 語(yǔ)句,in 后面的參數(shù)不一樣造成Hibernate緩存了大量SQL語(yǔ)句,占用大量的堆內(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)目中遇到的一些小問(wèn)題,通過(guò)這個(gè)例子,希望可以幫助大家日后分析類似問(wèn)題帶來(lái)一些幫助。新年的第一篇文章,看完如果有幫助,希望可以給個(gè)三連,你的鼓勵(lì)就是我不斷前進(jìn)的動(dòng)力。

        你可能感興趣:

        (拼命更新中,歡迎催更……)

        瀏覽 59
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一本一道久久综合狠狠躁牛牛影视 | 欧美黄色成人片 | 国产尤物精品在线 | 成人片18禁在线播放视频 | 女m被主人虐玩调教91 | 热99re69精品8在线播放 | 欧美操逼操逼操 | 麻豆国产在线视频 | 蜜桃久久99精品久久久酒店 | 成人三A级做爰无码视频 |