问题描述
利用多线程处理文件的过程中,根据文件名将文件平均分配到各个线程当中执行,程序内会将处理过后的文件删除掉。执行一段时间后发现,会有一类问价一直处理不掉,调查后发现这些没有被处理的文件为需要同一个线程需要处理的文件,推测可能是线程挂起了,但是不知道具体是什么原因造成的。
解决方式
利用jstack每十秒或者更长时间生成三份日志文件,重点观察出现问题的线程是由于什么原因挂起,在等待哪些资源问题。
使用语句
nohup jstack -l pid >/log.log &
输出log日志对比后发现是由于数据库使用长连接方式,在加载数据库配置数据时导致线程挂起,将数据库工具类中,获取数据库连接时的方式改为短连接后,重新测试,观察一段时间之后发现问题得到了解决。
jstack基本信息了解
通过thread dump分析线程状态,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。
在dump中,线程一般存在如下几种状态:
- RUNNABLE,线程处于执行中
- BLOCKED,线程被阻塞
- WAITING,线程正在等待