springboot自动重启

记一次springboot自动重启问题排查思维过程

先说结论

springboot有个插件dev-tool, 这个插件会自动检测classpath, 如果有代码变更会重启发布有可能引起重新启动服务, 我们的情况正好是往classpath中写入csv,zip等文件引起的.
所以,尽量不要把classpath下当做临时文件的输出目录,在服务器单独开辟独立空间,统一管理.

起因

一个研发小哥哥使用springboot框架开发一个生成文件及压缩文件的功能,开发过程中,一旦写入文件或者压缩文件时,会突然提示数据源session is closed,然后springboot就开始重启,调试了两天没搞定,于是咨询我.

表象

一旦写入一部分文件或者生成zip压缩文件时:

  1. 提示session is closed
  2. springboot开始重启

排查过程

1. 排查双数据源配置问题

由于首先提示session is closed, 由于小哥哥刚好配置了双数据源,之前是单数据源, 所以刚开始排查重点目标集中在是不是由于数据源没配置好, 导致关闭进而又引起了springboot重启.

当然通过我们的后见之明偏误的时候,会觉得这个推论站不住脚,因为即使数据源配置有问题,session is closed也不至于引起springboot重启.

之所以当时会在这块花时间我觉得有俩原因:

  1. springboot相关知识性缺失
  2. 对自己的推理不够信服

知识性缺失就是说对springboot和数据源配置不够了解.进而导致自己不敢肯定自己的推论.

排查内存使用

由于服务重启, 然后我们的场景又有读取一定量数据,写文件等操作. 所以很容易考虑到是内存占用导致的原因.遂打开垃圾回收机制,查看日志.

现象描述:

  1. 没有OOM相关错误
  2. gc日志有一些,young gc , 启动时有full gc, 看数据都是正常

此处需要的知识点是:

  1. OOM会导致进程挂掉,但是并不会重启
  2. 要知道young gc, full gc多久算频繁, 及相关耗时阈值算不正常

基于上述情况分析,我们应该把关注点放到springboot本身上, springboot本身是不是有什么机制会自己重启?

  1. 谁导致的重启
  2. 什么情况下会重启

G一下很容得出结论, springboot有一种dev-tool的工具会自动检测代码是否变更然后自动发布, 任何写入到classpath(当然有一些例外的文件夹,具体看它描述) 都会认为是代码变更,此时触发它的重新发布机制,所以接下来你需要做的就是弄清什么情况下热部署而不重启, 什么情况下需要重启服务.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值