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内存增长问题排查简例的更多相关文章

  1. jvm内存增长问题排查

    jvm内存增长问题排查 排查个jvm 内存占用持续增加的问题,纪录一下,引以为戒. 运维发现应用jvm内存占用在发布后回落,然后持续增高,,dump后分析一下: 占内存的大部分是这种名字相似的bean ...

  2. jvm 内存溢出问题排查方法

    如果你做TCP通讯或者map集合操作,并发处理等功能时,很容易出现 Java 内存溢出的问题.本篇文章,带领大家深入jvm,分析并找出jvm内存溢出的代码. jvm中除了程序计数器,其他的区域都有可能 ...

  3. JVM - 内存溢出问题排查相关命令jcmd jmap

    jcmd http://docs.oracle.com/javase/8/docs/technotes/tools/windows/jcmd.html jcmd-l  列出正在执行的JAVA进程ID ...

  4. 一次完整的JVM堆外内存泄漏故障排查记录

    前言 记录一次线上JVM堆外内存泄漏问题的排查过程与思路,其中夹带一些JVM内存分配机制以及常用的JVM问题排查指令和工具分享,希望对大家有所帮助. 在整个排查过程中,我也走了不少弯路,但是在文章中我 ...

  5. 排查JVM内存泄漏的命令

    1. jps 使用 jps -l -m 获取到当前jvm进程的pid,通过上述命令获取到了服务的进程号 jps(JVM Process Status Tool):显示指定系统内所有的HotSpot虚拟 ...

  6. 【死磕JVM】看完这篇我也会排查JVM内存过高了 就是玩儿!

    前言 CPU 是时分的,操作系统里面有很多线程,每个线程的运行时间由CPU决定,CPU会分给每一个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,就是100%,我们应该意识到 ...

  7. 华为云数据库GaussDB(for Cassandra)揭秘第二期:内存异常增长的排查经历

    摘要:华为云数据库GaussDB(for Cassandra) 是一款基于计算存储分离架构,兼容Cassandra生态的云原生NoSQL数据库:它依靠共享存储池实现了强一致,保证数据的安全可靠. 本文 ...

  8. JVM 常见线上问题 → CPU 100%、内存泄露 问题排查

    开心一刻 明明是个小 bug,但就是死活修不好,我特么心态崩了...... 前言 后文会从 Windows.Linux 两个系统来做示例展示,有人会有疑问了:为什么要说 Windows 版的 ? 目前 ...

  9. 【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

    Arthas是啥 当我们系统遇到JVM或者内存溢出等问题的时候,如何对我们的程序进行有效的监控和排查,就发现了几个比较常用的工具,比如JDK自带的 jconsole.jvisualvm还有一个最好用的 ...

随机推荐

  1. 【转】JQuery插件定义

    一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写("#"),("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人,直 ...

  2. Qt绘制文本二 弯曲排列和旋转效果 弧形路径 正弦函数路径

    void WgtText::paintEvent(QPaintEvent *event) { QPainter painter(this); QString m_string("abcdef ...

  3. MATLAB统计工具箱 转

    D:\Program Files\MATLAB\R2012b\toolbox\stats\stats MATLAB统计工具箱包括概率分布.方差分析.假设检验.分布检验.非参数检验.回归分析.判别分析. ...

  4. js里面判断一个字符串是否包含某个子串的方法

    1. ES6的includes, 返回 Boolean var string = "foo", substring = "oo"; string.include ...

  5. 0-MAVEN SETTING

    localRepository : 表示本地库的保存位置,也就是maven主要的jar包保存位置,默认在${user.dir}/.m2/repository,如果需要另外设置,就换成其他的路径 Ser ...

  6. 各个版本的jee(servlet,jsp)对应的web.xml的模板

    参考链接: https://yutuo.net/archives/7048a006eeb2ac85.html

  7. Windows系统上设置 Git Bash 的 Font 及 Locale

    在windows 上使用 Git Bash 可以获得 unix 命令 操作体验. 但是初始的Git Bash的字体及语系都很不方便,需要自己设置. 在Git Bash的命令窗体上边框点击鼠标右键可以进 ...

  8. Cracking The Coding Interview 3.2

    //How would you design a stack which, in addition to push and pop, also has a function min which ret ...

  9. Java 中的代理模式及动态代理

    原文:https://blog.csdn.net/briblue/article/details/73928350

  10. ubuntu多显示器单触摸屏校准

    多显示器单触摸屏屏幕校准 0.触摸屏重定向 sudo xinput map-to-output 13 DP1  #将触摸屏映射到指定的显示器 其中:13为触摸屏设备id,可通过 xinput命令查看 ...