首页 > 代码库 > jvm内存增长问题排查
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内部实现。
--------------------------
感谢一路有你~
jvm内存增长问题排查
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。