zoukankan      html  css  js  c++  java
  • 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内部实现。

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

    感谢一路有你~

  • 相关阅读:
    Python 集合
    Python 文字列
    JUNIT5(maven配置)
    Javascript严格模式
    移动互联测试
    Python的基础知识
    Linux系统下发件oa环境
    禅道的使用
    Linux系统的安装过程
    Oracle基础知识
  • 原文地址:https://www.cnblogs.com/killbug/p/6291036.html
Copyright © 2011-2022 走看看