你的位置:首页 > 软件开发 > Java > jvm内存增长问题排查简例

jvm内存增长问题排查简例

发布时间:2017-01-17 12:00:11
jvm内存增长问题排查排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒。运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean,哪里会产生这么多相同类产生的bean呢?应用使用了动态语言groovy,请求走 ...

jvm内存增长问题排查简例

jvm内存增长问题排查

排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒。

运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下:

jvm内存增长问题排查简例

 

占内存的大部分是这种名字相似的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 + "错误");  }}

 

解决方案就是在外层加一个缓存的map,来保证单例,如此就会失去脚本无发布便捷修改逻辑的优势,所以要做一个清除map的功能,可以手动触发,也可以定时触发。

原标题:jvm内存增长问题排查简例

关键词:jvm

jvm
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。