call stack是什么错误_什么都没动!应用系统又双叒起不来了

什么都没动!应用系统又双叒起不来了

前言

应用系统起不来是个非常常见的问题。这种现象特别容易在非生产环境出现。由于系统依赖 的一些外置资源,如数据库/redis等宕机(这个测试环境还是容易发生的)。就会导致系统一行代码都没有改,仅仅重启了下,就起不来的尴尬现象!

痛点

事实上,如果有对应的错误日志,我们还是很容易通过异常堆栈去判断到底哪个地方有问题的。有迹可循的错误当然好搞,最怕的就是系统启动的时候卡主了,什么都不输出!这时候由于没有任何信息,我们很难判断出原因,往往耗费大半天时间。9978538cd74bef97cea0773e9b678933.png

方法

今天笔者就介绍遇到这种情况常用的方法。我们知道,一个Java进程启动时候肯定有个主线程去做一系列的操作,例如SpringBoot/Tomcat的启动主线程就叫做main(JBoss的叫StartStop)。而这个主线程在启动成功后会打出

2020-09-25 13:38:51.089  INFO 59380 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8090 

这样类似的信息。如下图所示:9acab18016f04f5993ae0988584787a2.png

所以,如果没有任何日志输出而且系统无法提供任何服务的话,大部分情况下是Main线程运行一个耗时的操作卡住了!如下图所示:6e6050b11ff07f5e4dd3cdf9c09e7ce0.png

这时候,我们就需要知道到底Main线程卡在哪里,很简单,使用jstack!

jstack -l 你的进程id > stack.txt

如果你不知道你的Main线程叫什么名字,翻下已打印出来的日志,启动时候出现最多的那个线程名字大概率就是Main线程,而且名字也应该比较容易联想(什么Main啊,StartStop之类的)。jstack会将当时Java进程所有的线程Dump出来。我们只需要在里面搜索一下Main线程名字 对应的关键字即可,例如"main"

less stack.txt
less中寻找main,可能有多个main,名字最精确匹配的那个即可
例如笔者的一个例子:
stack.txt
"main" #1 prio=5 os_prio=0 tid=123456 nid=123 runnable [0x00213]
java.lang.Thread.State: RUNNABLE
 at java.net.SocketInputStream.socketRead0(Native Method)
 ......
 at oracle.net.ns.Packet.Receive(Packet.java:300)
 ......
 at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156)
 ......
 at java.lang.reflect.Method.invoke(Method.java:498)
 ......
 at org.springframework.boot.loader.JarLauncher.main(JarLuncher.java:51)

千万不要被这个RUNNABLE给骗了,在Java进程陷入系统调用后,线程状态依旧是RUNNABLE。如果吃不准,可以再jstack一次,看看是否两次线程都卡在同一段代码上。仔细观察下堆栈,就发现卡在druid数据源连接数据库上面!ed178d8a373c2dbebfee73e3f6e6c6d6.png

有了这个信息,就好办了,问题基本就可以轻松定位了。自己用工具去连一下关联的数据库,看看是否能够连接成功即可。笔者连了一下对应的数据库,果然不通,找了下DBA,拿到了新的地址,问题就解决了!

推荐一本书,这本书非常赞,豆瓣评分9.7!笔者看过之后大呼过瘾!绝对物超所值!

总结

好了,今天的分享就到此结束。如果系统起不来,看上去就卡主了,就按照下面的脑图分析。就能解决很多很多问题了!这是个实用的小技巧,希望对你有所帮助。27fb0e1c942d8e60d654814aaaa182c2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值