jvm內存增長問題排查簡例


jvm內存增長問題排查

排查個jvm 內存占用持續增加的問題,紀錄一下,引以為戒。

運維發現應用jvm內存占用在發布后回落,然后持續增高,,dump后分析一下:

 

占內存的大部分是這種名字相似的bean,哪里會產生這么多相同類產生的bean呢?

應用使用了動態語言groovy,請求走邏輯時,動態拿到腳本執行。

其中核心代碼就是groovy腳本轉成spring ioc 管理的bean,需要注入依賴其他bean:

public <T> T getScriptedObject(String scriptName, String scriptSource, Class<T> cls) {
    if (StringUtils.isEmpty(scriptSource))
        throw new RuntimeException("服務腳本" + scriptName + "為空");
    GroovyObject goo = null;
    Class clz = null;
    try {
        clz = groovyClassLoader.parseClass(scriptSource);
        goo = (GroovyObject) clz.newInstance();
        if (null != beanFactory) {
            beanFactory.autowireBeanProperties(goo, 1, true);
        }
    } catch (UnsatisfiedDependencyException ex) {
        //            ex.printStackTrace();
    } catch (Exception ex) {
        logger.error("腳本{}異常:{}", scriptName, ex);
        throw new RuntimeException(ex);
    }
    if (cls.isAssignableFrom(goo.getClass())) {
        return (T) goo;
    } else {
        throw new RuntimeException("腳本" + scriptName + "錯誤");
    }
}

 

這個產生bean的代碼一定是多例了:
beanFactory.autowireBeanProperties(goo, 1, true);
果然:

 

解決方案就是在外層加一個緩存的map,來保證單例,如此就會失去腳本無發布便捷修改邏輯的優勢,所以要做一個清除map的功能,可以手動觸發,也可以定時觸發。
問題解決了,原因就是開發的時候沒有很好的理解spring api內部實現。

 

--------------------------

感謝一路有你~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM