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)


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

  • 相关阅读:
    poj 1700 Crossing River 过河问题。贪心
    Alice's Print Service
    POI 2000 ------Stripes
    Uva 1378
    hdu 3068 最长回文
    bnu Game 博弈。
    链栈的C语言实现
    链栈的C语言实现
    顺序栈C语言实现
    顺序栈C语言实现
  • 原文地址:https://www.cnblogs.com/paidaxing7090/p/15188456.html
Copyright © 2011-2022 走看看