linux: centos7.4
jdk:1.8
cpu: 16核
问题分析:
java业务场景是业务员在页面点击了一个订单详情数据下载,页面等待超2个小时,最后直接超时退出。
解决方案:
各位同学,既然用java,jstack工具肯定也常用,下面我详细说明。
1.使用ps -ef | grip java查询出pid
2. 用top -H -p pid查询出使用率比较高的线程的tpid(线程的)
3. 把tpid(线程的)通过print '%x\n' tpid(线程的)转换出16进制数字 nid
4. 使用jstack 分析堆栈信息
jstack tpid | grep 'nid' -C5 -color
以上命令可以看出nid的耗时线程信息
5. 根据步骤4的信息,重点关注WAITTING 和TIMED_WAITTING信息,会出现循环多次的等待,但是不进行线程资源的释放。
本次我遇到的问题是使用了连接数据库的自定义驱动,在连接数据库查询大量数据,每次分页查询没有完全释放连接,导致数据库连接一直在上下文切换,导致cpu过载。