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. jstack Dump 日志文件中的线程状态

    [转]jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on condi ...

  2. commonJS 和 ES6 模块化的不同

    commonjs 导出 module.exports={ add:function(){ console.log('add测试') } } 导入 var add=require('./add.js') ...

  3. learning ddr reset initialization with stable power

  4. Android 音视频深入 一 AudioRecord录音生成pcm转换为wav(附源码下载)

    本篇项目地址,名字是AudioRecord录音(能暂停,将pch转换为wav),求starhttps://github.com/979451341/Audio-and-video-learning-m ...

  5. linux生成SSH key

    1. 检查SSH keys是否存在 ls -al ~/.ssh2. 生成新的ssh key 输入 ssh-keygen -t rsa -C your_email@example.com

  6. 读写锁 SRWLOCK

    读写锁在对资源进行保护的同时,还能区分想要读取资源值的线程(读取者线程)和想要更新资源的线程(写入者线程). 对于读取者线程,读写锁会允许他们并发的执行.当有写入者线程在占有资源时,读写锁会让其它写入 ...

  7. 自定义AXI-IP核(转)

    目的: 自定义一个IP核,通过AXI总线与ARM系统连接 环境: Win7 32bit Vivado2014.4.1 Xilinx sdk2014.4 开发板: Zc702 第一步: 新建一个自定义的 ...

  8. Problem B 字符串类(I)

    封装一个字符串类,用于存储字符串和处理的相关功能,支持以下操作: 1. STR::STR()构造方法:创建一个空的字符串对象. 2. STR::STR(const char *)构造方法:创建一个字符 ...

  9. shell怎么判断两个文件内容是否相同

    #cat diff_two_file#/bin/sbinfile1=/mnt/mmc/test/aafile2=/mnt/mmc/test/bbdiff $file1 $file2 > /dev ...

  10. day 35 关于线程

    并发编程之协程   对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计 ...