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

摘要:
打开Linux服务器,单击top命令查看消耗CPU的Java进程,并观察该进程在操作系统中不会消耗高CPU。使用top-pPID和jstack命令打印转储信息并使用top-H-8819。仔细观察后发现,线程9809偶尔会跳到第一行。将线程号9809转换为十六进制到2651.vimjavademo.dump打开转储文件/2651Search2651以查看topDemo()方法。

使用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";
    }
}

部署
使用top命令、dump文件定位问题第1张
打开浏览器访问:
使用top命令、dump文件定位问题第2张
使用top命令、dump文件定位问题第3张
访问test接口是一直处于等待状态。

3.定位问题

连接到linux服务器 。

打开 Linux 服务器,敲 top 命令查看消耗 CPU 中的 Java 进程,通过观察该进程在操作系统中消耗 CPU 不高。
使用top命令、dump文件定位问题第4张
使用 top -p PID
使用top命令、dump文件定位问题第5张
使用 jstack 命令进行,打出 dump 信息
使用top命令、dump文件定位问题第6张
使用 top -H -p 8819 .仔细观察一下,发现 9809这个线程 偶尔会 跳到第一行.
使用top命令、dump文件定位问题第7张
将线程号 9809 转换成16进制即为2651 . (可以敲命令 printf "%x " 9809 输出16进制)

vim javademo.dump 打开dump文件

/2651 搜索2651

可以看到 topDemo()这个方法。
使用top命令、dump文件定位问题第8张
"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)
使用top命令、dump文件定位问题第9张
使用top命令、dump文件定位问题第10张
这样就定位到了问题代码。

免责声明:文章转载自《使用top命令、dump文件定位问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅Barcodex帮助文档下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

js与Nodejs的单线程和异步--初探

Event Loop Event Loop : 浏览器使用 Event Loop 来协调 DOM 事件、UI 渲染、脚本执行和网络事件等。 Task Queue (Event Queue) :每当 DOM 事件、计时器事件或者网络事件被触发时,它们的回调函数和 Context 都会被压入 Event Queue,而 Event Loop 则会从中取出...

JavaNetty拆包粘包(二)

netty 使用 tcp/ip 协议传输数据。而 tcp/ip 协议是类似水流一样的数据传输方式。多次 访问的时候有可能出现数据粘包的问题,解决这种问题的方式如下: 定长数据流  客户端和服务器,提前协调好,每个消息长度固定。(如:长度 10)。如果客户端或服 务器写出的数据不足 10,则使用空白字符补足(如:使用空格)。  /** * 1. 单线程组...

浅析.Net下的多线程编程(1)

作者:peter 出处:天极论坛 多线程是许多操作系统所具有的特性,它能大大提高程序的运行效率,所以多线程编程技术为编程者广泛关注。 目前微软的.Net战略正进一步推进,各种相关的技术正为广大编程者所接受,同样在.Net中多线程编程技术具有相当重要的地位。本文我就向大家介绍在.Net下进行多线程编程的基本方法和步骤。 开始新线程 在.Net下创建一个新线...

曹工说Tomcat:200个http-nio-8080-exec线程全都被第三方服务拖住了,这可如何是好(上:线程模型解析)

前言 这两年,tomcat慢慢在新项目里不怎么接触了,因为都被spring boot之类的框架封装进了内部,成了内置server,不用像过去那样打个war包,再放到tomcat里部署了。 但是,内部的机制我们还是有必要了解的,尤其是线程模型和classloader,这篇我们会聚焦线程模型。 其实我本打算将一个问题,即大家知道,我们平时最终写的control...

基础概念——C标准、C运行库和glibc

C标准:C 标准主要由两部分组成,一部分描述C的语法,另一部分描述C标准库(描述了一些C标准函数的原型,但是不提供实现)。C标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义。 常见的C标准就是ANSI C;美国国家标准协会;为了提高C语言的开发效率,C标准定义了一系列常用的函数,称为C标准库函数。应用程序开发者可以包含这些...

(转)JS window对象的top、parent、opener含义

1.top    该变更永远指分割窗口最高层次的浏览器窗口。如果计划从分割窗口的最高层次开始执行命令,就可以用top变量。 2.opener opener用于在window.open的页面引用执行该window.open方法的的页面的对象。例如:A页面通过window.open()方法弹出了B页面,在B页面中就可以通过opener来引用A页面,这样就可以通...