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

 

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

感谢一路有你~

posted on   每当变幻时  阅读(2851)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2013-01-16 图片上传+预览+剪切解决方案-我们到底能走多远系列(20)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示