资讯专栏INFORMATION COLUMN

jstack分析线程状态

RancherLabs / 2488人阅读

摘要:通过分析线程状态除了上述的分析,大多数情况下会基于分析当前各个线程的运行情况,如是否存在死锁是否存在一个线程长时间持有锁不放等等。

背景

记得前段时间,同事说他们测试环境的服务器cpu使用率一直处于100%,本地又没有什么接口调用,为什么会这样?cpu使用率居高不下,自然是有某些线程一直占用着cpu资源,那又如何查看占用cpu较高的线程?

/**
 *一个线程占用较高的cpu资源
 *
 * Created by haoting.wang on 2017/2/24.
 */
public class JstackCase {


    static ExecutorService executorService = Executors.newFixedThreadPool(5);

    public static void main(String[] args) {

        Task task1 = new Task();
        Task task2 = new Task();
        executorService.execute(task1);
        executorService.execute(task2);
    }


    public static Object lock = new Object();

    static class Task implements Runnable{

        public void run() {

            synchronized (lock){
                calculate();
            }
        }

        public void calculate(){
            long i = 0L;
            while (true){
                i++;
            }
        }
    }
}
top命令

在linux环境下,可以通过top命令查看各个进程的cpu使用情况,默认按cpu使用率排序

1、上图中可以看出pid为18106的java进程占用了较多的cpu资源;
2、通过top -Hp 18106可以查看该进程下各个线程的cpu使用情况;

上图中可以看出pid为18121的线程占了较多的cpu资源,利用jstack命令可以继续查看该线程当前的堆栈状态。

jstack命令

通过top命令定位到cpu占用率较高的线程之后,继续使用jstack pid命令查看当前java进程的堆栈状态
jstack 18106

在top命令中,已经获取到了占用cpu资源较高的线程pid,将该pid转成16进制的值,在thread dump中每个线程都有一个nid,找到对应的nid即可;隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。

通过thread dump分析线程状态

除了上述的分析,大多数情况下会基于thead dump分析当前各个线程的运行情况,如是否存在死锁、是否存在一个线程长时间持有锁不放等等。

在dump中,线程一般存在如下几种状态:

RUNNABLE,线程处于执行中

BLOCKED,线程被阻塞

WAITING,线程正在等待

“Entry Set”中等待的线程状态是 “Waiting for monitor entry”,而在 “Wait Set”中等待的线程状态是 “in Object.wait()。Wait on condition网络瓶颈的征兆”。 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66730.html

相关文章

  • 使用JDK自带的工具jstack找出造成运行程序死锁的原因

    摘要:如何分析造成多线程的原因呢很多时候我们在怀疑造成死锁的语句设置断点,单步调试,反而又不能重现了。有了,程序员不用对着冗长烧脑的多线程代码去冥思苦想了,会自动把死锁原因打印出来,太方便了。 Java多线程编程也是Java面试中经常考察的内容。刚接触Java多线程编程的朋友们,可能会不慎写出一些会导致死锁(deadlock)的应用出来。如何分析造成Java多线程的原因呢?很多时候我们在怀疑...

    Render 评论0 收藏0
  • java虚拟机故障处理工具

    摘要:这些工具包括名称主要作用显示指定系统内所有的虚拟机进程。虚拟机堆转存快照分析工具命令用于与搭配使用,用来分析生成的文件。命令格式命令样例线程堆栈跟踪工具用于生成虚拟机当前时刻的线程快照。 概述 给系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。 java开发人员可以在jdk安装的bin目录下找到除了java,javac以外的其他命令。这些命令主要是一...

    loonggg 评论0 收藏0
  • JVM详解3.JDK监控和故障处理工具

    摘要:点击进入我的博客命令行工具这些工具大多数是类库的一层薄的包装,它们的主要功能代码是在类库中实现的。可视化工具是到目前为止随发布的功能最强大的运行监视和故障处理程序,并且可以预见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。 点击进入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...

    Keven 评论0 收藏0
  • JVM内存分析工具使用

    摘要:我们经常用到的一工具分析栈内存点击下载分析堆内存。下面我详细介绍一下他们具体是使用方法是自带的一个分析工具,我们可以在的安装目录找到中找到。 Java 内存堆栈分析。我们在分析现网问题时候,经常会遇到一些问题从日志上无法分析的疑难问题。在我们举足无措的时候,我们可以分析一些JVM内存,来看看问题出在哪里了。 我们经常用到的一工具: 分析栈内存(stack):jstack/kill -3...

    alanoddsoff 评论0 收藏0

发表评论

0条评论

RancherLabs

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<