记一次springboot程序运行过程中假死(阻塞)问题

今天在编码的时候,回到web项目的浏览器刷新网页,发现请求迟迟下不来,查看控制台才发现,项目日志输出动都不动一下的,查看windows任务管理器,好家伙,idea的cpu和内存占用率双双突破90%,初步怀疑是代码问题,于是进行springboot项目假死分析。

1、查看java进程的pid生成stack文件。

首先在任务管理器下查看到当前pid为11848,任务管理器没有pid展示的可以在左上角名称列右键,选中pid就行。
查看pid
然后根据这个pid,以管理员的身份在 C:\Windows\system32\ 文件夹下打开cmd窗口,输入以下命令得到stack文件。

jstack -l 11848 >c:/11848.stack

其中11848是刚查询到的pid,c:/11848.stack 是我将这个文件生成在c盘的根目录下并命名为11848.stack
在这里插入图片描述

2、使用Process Explorer分析properties

准备工具:Process Explorer
下载地址:https://docs.microsoft.com/zh-cn/sysinternals/downloads/process-explorer

点击下载
点击此处下载

下载完成之后解压得到Process工具,打开procexp.exe,根据pid找到进程。
在这里插入图片描述
右键选择properties…
在这里插入图片描述
选择Threads之后以CPU排序找到占用最高的TID
在这里插入图片描述

3、根据TID分析stack文件

找到TID之后,我们要先转换一下TID,把它转成16进制。
在这里插入图片描述

然后我们拿 40CC 这个十六进制数,打开生成的stack文件,查询。
在这里插入图片描述
最后我们可以在查询出的TID下面看到哪里的代码有问题(由于我的问题已经解决,这里就不复现)。

4、总结

根据查询出来的信息,最终定位到了一个方法,方法里面有一个近乎无限循环调用导致程序假死,暂时注释这个方法,程序恢复正常。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Spring Boot过程,可能会遇到应用程序变得缓慢或无响应的情况,这种情况通常被称为“假死”。假死可能有多种原因,下面列举了一些常见的原因和解决方法: 1. 内存不足:当应用程序的内存不足时,会导致假死。这可能是因为应用程序占用的内存过多,或者Java虚拟机的堆内存设置不足。解决办法是增加堆内存的大小,可以通过在application.properties或application.yml文件设置"spring.jvm.memory"属性来增加堆内存大小。 2. 数据库连接问题假死可能是由于数据库连接问题导致的。这可能是由于数据库连接池被耗尽或数据库连接的超时设置不合理。解决办法包括增加数据库连接池的大小、增加连接超时时间,或者重新配置数据库连接池。 3. 线程阻塞假死也可能是由于线程阻塞导致的。例如,当某个线程无限期等待某个资源时,会导致其他线程无法继续执行,从而导致假死。解决办法是查找并修复线程阻塞的原因,例如使用适当的同步机制或设置适当的超时时间。 4. 慢查询:假死也可能是由于慢查询导致的。当数据库查询操作耗时过长时,会导致应用程序变得缓慢或无响应。解决办法包括优化查询语句、添加索引、使用缓存等。 5. 死锁:假死也可能是由于死锁导致的。当多个线程相互等待对方释放资源时,会导致死锁,从而导致应用程序无法继续执行。解决办法是避免产生死锁的条件,例如使用适当的锁粒度、避免循环等待等。 总结起来,处理Spring Boot的假死问题需要综合考虑内存、数据库连接、线程等多个方面的原因,并逐一排查和解决问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值