java(spring boot)程序启动(失败|慢|卡死)解决

在平常的工作中,我们有时会遇到项目启动一直卡在某个地方,但是又没有日志输出,很难定位到底是在哪里卡住,下面笔者分析下个人本地调试的一些经验。

1.为什么会卡

首先我们需要明确下有哪些情况会导致主线程阻塞。在平常开发工作中,以下是常见场景

  1. 网络请求阻塞(包括连接数据库,redis等,但一般此类设计时都会有超时时间)
  2. 读取和写入本地流时一直阻塞
  3. 开启debug定点程序被手动阻塞
  4. debug模式下断点过多会导致启动非常慢(不至于卡死)

2.如何解决

2.1快照分析

针对1、2这种情况,我们可以通过debug的快照模式进行分析,如果程序卡在某一步,通过快照分析线程的方法栈找到阻塞的具体类,再做具体分析。

以上是笔者的程序在运行过程中的某一份快照,可以看到主程序并未阻塞,一般阻塞状态下是waiting,如果你的程序出问题了,可以仔细观察右侧的堆栈信息进行错误类的分析,下面是我的程序中的堆栈信息

"lettuce-nioEventLoop-4-2@14103" daemon prio=5 tid=0x9e nid=NA runnable
  java.lang.Thread.State: RUNNABLE
	  at sun.nio.ch.KQueueArrayWrapper.kevent0(KQueueArrayWrapper.java:-1)
	  at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)
	  at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:117)
	  at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
	  - locked <merged>(a sun.nio.ch.KQueueSelectorImpl)
	  - locked <merged>(a java.util.Collections$UnmodifiableSet)
	  - locked <merged>(a io.netty.channel.nio.SelectedSelectionKeySet)
	  at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
	  at io.netty.channel.nio.SelectedSelectionKeySetSelector.select(SelectedSelectionKeySetSelector.java:62)
	  at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:806)
	  at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:454)
	  at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
	  at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
	  at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	  at java.lang.Thread.run(Thread.java:745)

2.2debug模式分析

第三种情况基本上只要认真观察开发IDE工具,不会犯这种低级错误,倒是第四种情况需要引起注意,因为有时开发人员未仔细查看,程序也能跑,但是非常慢的情况,第一反应都会想去看代码上的问题,需要注意的是实际上可能是DEBUG模式下过多断点导致程序出现问题。

2.2.1如果看自己打的断点

在这里插入图片描述

点击红色的点(Break Points),然后idea会弹出一个弹窗:

在这里插入图片描述

当前程序的的断点均为会展示在 Java Line Breakpoints下,如果没有必要的情况,将该清理的断点删除即可。

3.结语

笔者本次遇到的问题是属于情况4,起初认为是程序的问题,分析了一遍未找着原因,然后通过打印快照发现程序也正常运行,此时突然想起断点比较多,至此总结一番本次遇到的一直开发过程中的小问题,方便下次查阅。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值