什么是线程dump

Java Thread dump记录了线程在jvm中的执行信息,可以看成是线程活动的日志。Java线程转储文件有助于分析应用程序和死锁情况中的瓶颈。

如何获取线程转储文件

在这里,我们将学习为java程序生成线程转储的多种方法,这些指令对于linux操作系统是有效的,但是在windows中,这些步骤可能有些不同。

1.使用VisualVM Profiler

右键选择线程Dump便会自动生成线程转储文件,当然你也可以连接远程机器对其进行监控和分析

2.jstack

jdk自带的工具jstack通过它我们也可以生成应用程序的线程转储文件,只需要两步即可完成:

  1. 1>找到应用程序的进程ID
  2. ps -eaf | grep java
  3. 2> 输出线程转储信息到文件或控制台
  4. jstack PID >> mydumps.tdump
  5. jstack PID

3.kill -3 PID

该方法与其它生成线程转储文件的方法略有不同,当kill命令发出时,线程存储文件将在该应用程序的外部生成,如果java程序是一个Tomcat服务器,带有系统输出文件catalina.out,那么将在此文件中生成线程转储

4.jcmd

jdk8中介绍了jcmd工具,在jdk8及以上环境下,可以使用此命令生成线程转储文件

命令是:

  1. jcmd PID Thread.print

线程转储文件说明

  1. "Attach Listener" #44 daemon prio=9 os_prio=0 tid=0x00007f88b0001800 nid=0xa89 waiting on condition [0x0000000000000000]
  2. java.lang.Thread.State: RUNNABLE
  3. "ajp-nio-8009-AsyncTimeout" #42 daemon prio=5 os_prio=0 tid=0x00007f88dc49c000 nid=0xa7e waiting on condition [0x00007f88c8470000]
  4. java.lang.Thread.State: TIMED_WAITING (sleeping)
  5. at java.lang.Thread.sleep(Native Method)
  6. at org.apache.coyote.AbstractProtocol$AsyncTimeout.run(AbstractProtocol.java:1211)
  7. at java.lang.Thread.run(Thread.java:748)
  8. "ajp-nio-8009-Acceptor-0" #41 daemon prio=5 os_prio=0 tid=0x00007f88dc3b8800 nid=0xa7d runnable [0x00007f88c8571000]
  9. java.lang.Thread.State: RUNNABLE
  10. at sun.nio.ch.ServerSocketChannelImpl.accept0(Native Method)
  11. at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:422)
  12. at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:250)
  13. - locked <0x00000000f5f08d48> (a java.lang.Object)
  14. at org.apache.tomcat.util.net.NioEndpoint$Acceptor.run(NioEndpoint.java:453)
  15. at java.lang.Thread.run(Thread.java:748)
  16. "ajp-nio-8009-ClientPoller-0" #40 daemon prio=5 os_prio=0 tid=0x00007f88dc3b6800 nid=0xa7c runnable [0x00007f88c8672000]
  17. java.lang.Thread.State: RUNNABLE
  18. at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)
  19. at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:269)
  20. at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
  21. at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
  22. - locked <0x00000000f0e02b08> (a sun.nio.ch.Util$3)
  23. - locked <0x00000000f0e02af8> (a java.util.Collections$UnmodifiableSet)
  24. - locked <0x00000000f0e029e0> (a sun.nio.ch.EPollSelectorImpl)
  25. at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
  26. at org.apache.tomcat.util.net.NioEndpoint$Poller.run(NioEndpoint.java:785)
  27. at java.lang.Thread.run(Thread.java:748)

线程转储是所有线程的列表,每个条目显示关于线程的信息,其中包括按照执行的顺序进行跟踪的信息。线程转储文件中的信息包含以下几个部分:

  1. 1、线程名字
  2. 2、线程优先级
  3. 3、线程ID
  4. 4、线程状态:显示当前线程状态,例如:RUNNABLE, WAITING, 5BLOCKED,在分析死锁的同时,查找他们试图获取锁的阻塞线程和资源
  5. 6、堆栈信息:在这里如果线程在等待任何锁,我们可以看到线程获得的锁的地方

翻译自:https://www.journaldev.com/1053/java-thread-dump-visualvm-jstack-kill-3-jcmd

Java线程之Dump的更多相关文章

  1. Java线程之 InterruptedException 异常

    Java线程之 InterruptedException 异常   当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛 ...

  2. java 线程之executors线程池

    一.线程池的作用 平时的业务中,如果要使用多线程,那么我们会在业务开始前创建线程,业务结束后,销毁线程.但是对于业务来说,线程的创建和销毁是与业务本身无关的,只关心线程所执行的任务.因此希望把尽可能多 ...

  3. java 线程之concurrent中的常用工具 CyclicBarrier

    一.CyclicBarrier CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).在涉及一组固定大小的线程的程序 ...

  4. C++/Java线程之分

    JAVA线程状态图 1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭). ----1.1 一个进程中可以有 ...

  5. Java线程之CompletionService批处理任务

    如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...

  6. Java线程之Synchronized用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...

  7. Java线程之Java内存模型(jmm)

    一.Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial

  8. Java线程之FutureTask

    简述 FutureTask是Future接口的实现类,并提供了可取消的异步处理的功能,它包含了启动和取消(start and cancel)任务的方法,同时也包含了可以返回FutureTask状态(c ...

  9. Java线程之Callable、Future

    简述 在多线程中有时候我们希望一个线程执行完毕后可以返回一些值,在java5中引入了java.util.concurrent.Callable接口,它类似于Runnable接口,但是Callable可 ...

随机推荐

  1. Vue用递归实现一个消除输入框表情符的自定义directive

    最近项目中有一个需求,所有的文本输入框需要过滤掉表情符号,但是觉得每次表单验证的时候去判断,有点麻烦.于是我想到了自定义一个指令,后续遇到需要删除表情符号的输入框,直接通过指令将表情符号删除就好了,方 ...

  2. 【原创】大数据基础之Drill(1)简介、安装及使用

    https://drill.apache.org/ 一 简介 Drill is an Apache open-source SQL query engine for Big Data explorat ...

  3. python 访问权限

    访问权限 权限: 公有的:类中的普通属性和方法,默认都是公有的,可以在类的内部.外部.子类中使用 私有的:定义是在前面加两个'_',只能在本类的内部使用,不能再外部及子类中使用 示例: class P ...

  4. vue学习(5)-评论功能(利用父组件的方法)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Matplotlib 随机漫步图

    import matplotlib.pyplot as plt from random import choice class Randomwalk(): def __init__(self,num_ ...

  6. sqoop 安装

    Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle , ...

  7. Joomla 3.0.0 - 3.4.6 RCE漏洞分析记录

    0x00  前言 今天早上看到了国内几家安全媒体发了Joomla RCE漏洞的预警,漏洞利用的EXP也在Github公开了.我大致看了一眼描述,觉得是个挺有意思的漏洞,因此有了这篇分析的文章,其实这个 ...

  8. navicat连接阿里云mysql

    1.服务器控制台在安全组配置3306端口 2.进入 /etc/ssh/sshd_config 在最下面 加入下面代码 KexAlgorithms diffie-hellman-group1-sha1, ...

  9. 深入学习Mybatis框架(一)- 入门

    1.什么是Mybatis? Mybatis是一个优秀持久层框架,提供了对数据库的一系列操作(增删改查).Mybatis可以避免重复的写JDBC代码,让我们以较少的代码实现对数据库的操作,从而提高开发效 ...

  10. linux基础—课堂随笔_03 SHELL脚本编程基础

    shell脚本编程基础 条件选择:if语句 选择执行: 注意:if语句可嵌套 单分支 if(开头)判断条件:then条件为真的分支代码 fi(结尾) 双分支 if(开头)判断条件:then条件为真的分 ...