原文地址:开发者导航 · 你想要的,我全都有!

背景介绍

一般项目开发完毕就要部署到服务器上,很多公司的服务器采用的是Linux系统,但也有一些公司用的是Windows系统。最近有个项目,使用Springboot开发,项目打成jar后,部署在windows环境下,通过命令:java -jar scss.jar的方式启动运行。运行一段时间后,发现CMD黑窗口卡主不动,日志不再刷新,而系统内存、CPU占用等关键指标并没有异常。

原因分析

关闭黑窗口,重新启动应用,当应用无法访问时,找到Java安装目录/bin路径下的jvisualvm.exe ,双击运行,然后在左侧打开我们的应用:GuardApplication,

然后点击右侧的“线程Dump”,保存当前所有线程信息,保存为dump文件,可在左侧点击查看保存内容。

在CMD窗口输入:Ctrl+C,强制结束应用线程,然后重复上面的操作,获得新的线程快照。

比较dump文件内容

执行Ctrl+C线程状态变化的是第二个线程挂起,在等待第一个线程,但是第一个线程在写日志,但一直处在Runnable状态。
结论:一个线程执行时,导致另一个线程IO阻塞,从而导致应用后台卡住。

解决办法

1)将springboot日志输出改为异步方式,避免同步输出引起线程阻塞。

2)windows系统中cmd存在日志输出bug,经常导致日志卡住,具体表现为:命令行卡死不动,但是进程和线程依然再运行。此时敲一下回车键,命令行会马上打印卡死期间输出的信息。

这种情况,只需要对cmd窗口进行设置即可:右键窗口标题,属性,把快速编辑模式关掉就可以了。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐