• 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内部实现。

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

    感谢一路有你~

  • 相关阅读:
    学习进度笔记4
    学习进度笔记3
    学习进度笔记2
    学习进度笔记1
    《梦断代码》提及文献
    《梦断代码》阅读笔记6
    《梦断代码》阅读笔记5
    需求征集系统开发进度5
    《梦断代码》阅读笔记4
    spark filter
  • 原文地址:https://www.cnblogs.com/killbug/p/6291036.html
Copyright © 2020-2023  润新知