zoukankan      html  css  js  c++  java
  • 使用top命令、dump文件定位问题

    使用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 " 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)


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

  • 相关阅读:
    笔记本电脑处理器(CPU)性能排行榜
    SQL Server 2008管理工具出现 远程过程调用失败0x800706be解决方法
    Installshield使用教程
    区间DP--凸多边形三角剖分
    树形DP--codevs 1380 没有上司的舞会
    DP练习 巡逻
    DP练习 最长上升子序列nlogn解法
    线段树 求区间连乘——hdu 3074 Multiply game
    模拟算法+栈 HDU 1022
    并查集--CSUOJ 1601 War
  • 原文地址:https://www.cnblogs.com/paidaxing7090/p/15188456.html
Copyright © 2011-2022 走看看