<span>使用top命令、dump文件定位问题</span>

使用top命令、dump文件定位问题

1.背景

定位java应用出问题的代码块

2.一个demo

一个springboot创建的demo

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DemoController {
    /**
     * 测试demo
     *
     * @return
     */
    @GetMapping("/test")
    public Object topDemo() {
        for (int i = 0; i < 100000; i += 2) {
            try {
                System.out.println(" print" + i);
                Thread.sleep(i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return "test";
    }

    /**
     * 调试
     *
     * @return
     */
    @GetMapping("/test2")
    public Object topDemo1() {
        return "ok";
    }
}

部署

打开浏览器访问:


访问test接口是一直处于等待状态。

3.定位问题

连接到linux服务器 。

打开 Linux 服务器,敲 top 命令查看消耗 CPU 中的 Java 进程,通过观察该进程在操作系统中消耗 CPU 不高。

使用 top -p PID

使用 jstack 命令进行,打出 dump 信息

使用 top -H -p 8819 .仔细观察一下,发现 9809这个线程 偶尔会 跳到第一行.

将线程号 9809 转换成16进制即为2651 . (可以敲命令 printf "%x\n" 9809 输出16进制)

vim javademo.dump 打开dump文件

/2651 搜索2651

可以看到 topDemo()这个方法。

"http-nio-8080-exec-5" 线程名称
井20 线程编号
daemon 线程的类型
prio=5 线程的优先级别
os_prio=0 系统级别的线程优先级
tid=0x00007f5270008800 线程ID
nid=0x2651 native线程的id
waiting on condition 线程当前的状态
[0x00007f5266bf4000] 线程占用内存地址
java.lang.Thread.State: TIMED_WAITING (sleeping)


这样就定位到了问题代码。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-04 18:25
点赞 评论 收藏
分享
06-25 09:33
厦门大学 Java
程序员饺子:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司7个岗位
点赞 评论 收藏
分享
06-14 19:09
门头沟学院 Java
darius_:给制造业搞的,什么物料管理生产管理,设备管理点检,最最关键的就是一堆报表看板。个人觉得没啥技术含量都是些基本的crud,但是业务很繁琐那种
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-01 17:13
想去,但是听说加班强度实在难崩,所以拒绝了,现在有点心梗对面hr感觉也是实习生,打电话的时候怪紧张的,但是感觉人很好嘞
水中水之下水道的鼠鼠:哥们这不先去体验一下,不行再跑呗,大不了混个实习经历(有更好的转正offer就当我没说)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务