springboot项目在cmd窗口运行后台卡顿问题

1、背景介绍

项目使用Springboot开发,项目打成jar后,部署在windows环境下,通过命令:java -jar project.jar的方式启动运行。

2、问题描述

项目每次启动后,开始时可以正常访问。经过一段时间的运行,通过浏览器系统无法登陆,查看后台日志时,可以看到系统后台卡住,日志不再输出。在CMD窗口输入Ctrl + C,强制结束应用进程后,系统便能正常登录。

有时,在CMD窗口通过输入回车,后台会将之前卡住的日志全部刷出来,然后便能正常登录,但有时输入回车不起作用。

3、问题追踪

当系统后台再次卡住,应用无法访问时,按照如下步骤进行排查定位:

  1. 找到java_home的bin下jvisualvm.exe ,双击运行,即可看到下图界面;
    在这里插入图片描述
  2. 点击右侧**“线程Dump”**按钮,保存当前所有线程信息,保存为dump文件,可在左侧点击查看保存内容。
    在这里插入图片描述
  3. 在CMD窗口输入:Ctrl+C,强制结束应用线程;
  4. 如第二步操作,再次保存结束线程后,所有线程的快照。

4、线程快照分析

  1. 线程统计情况对比:
    Ctrl+C执行前
    在这里插入图片描述
    Ctrl+C执行后
    在这里插入图片描述
  2. 线程执行情况对比:
    Ctrl+C执行前
    在这里插入图片描述
    Ctrl+C执行后
    在这里插入图片描述
  3. dump文件内容对比:
    在这里插入图片描述
    在这里插入图片描述
    执行Ctrl+C线程状态变化的是QuartzScheduler_QuartzSchedulerThread,第二个线程挂起,在等待第一个线程;第一个线程在写日志,但一直处在Runnable状态。
    结论:定时任务执行时,写日志输出IO阻塞,导致应用后台卡住。

5、解决办法

  1. 将springboot日志输出,修改为异步的方式输出,避免同步输出阻塞;
  2. 由于windows中cmd存在日志输出bug,导致经常性日志卡住,具体表现为:输出内容卡死问题(命令行卡死不动,但是进程和线程依然再运行),随便敲一下回车键,命令行会马上打印卡死期间输出的信息。这种情况,只需要对cmd窗口进行设置即可:右键窗口标题-属性,把快速编辑模式关掉就能避免这个问题。

参考:https://www.v2ex.com/t/351238
           https://www.iteye.com/topic/1114219
           https://blog.csdn.net/lmb55/article/details/79233453
           https://blog.csdn.net/bruce128/article/details/47402669

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值