zoukankan      html  css  js  c++  java
  • spring boot + embed tomcat + standalone jar的内存泄露问题

    前一阵遇到了一个很坑的内存泄露问题,记录于此:

    有个项目采用spring cloud重构后,部署到线上(其中有一个接口,大概每天调用量在1千万次左右),发现zabbix监控里,linux的可用内存一直持续下降,每次重启后,大概能撑1天,就算业务高峰过去了,内存也不见回收,曲线图如下:

    点击看原图

    发生故障时,用top -m 看java进程占用的内存并不算高,而且spring boot的acurator端点监控,以及jvm的内存监控都在正常值范围内,刚开始怀疑是jvm参数设置不合理,调整了G1垃圾收集器各种参数组合,没有明显效果,然后尝试换回CMS收集器,再折腾了几天,仍然如此。用dump导出来分析,线程数、大对象啥的都不高,遂怀疑是spring cloud的坑。

    攀墙出去google了下,无意搜索" spring boot memory leak",发现有些人遇到了类似的问题,共同点都是embed tomcat + standalone jar运行方式,于是怀着试一试的心理,把容器换成了undertow,居然稳定了!

    点击看原图

    附,更换方法:

        compile('org.springframework.boot:spring-boot-starter-web') {
            exclude module: "spring-boot-starter-tomcat"
        }
        compile('org.springframework.boot:spring-boot-starter-undertow')  

    注:其它jar包也有可能隐式依赖了tomcat,保险起见最好加一个全局的排除处理

        configurations {
            all*.exclude group: "org.springframework.boot", module: "spring-boot-starter-tomcat"
        } 
  • 相关阅读:
    struts2通过配置文件进行数据校验无效
    几个windows使用小技巧
    让程序员抓狂的排序算法教学视频
    关于js中使用close方法无法关闭firefox浏览器
    JavaScript基础
    最全的Java面试宝典
    cookie注入
    Google搜索技巧
    Java之多态
    Winform之GDI绘制验证码
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/the-memory-leak-problem-of-spring-boot-with-embed-tomcat.html
Copyright © 2011-2022 走看看