1. 线程转储简介

线程转储(Thread Dump)就是JVM中所有线程状态信息的一次快照。

线程转储一般使用文本格式, 可以将其保存到文本文件中, 然后人工查看和分析, 或者使用工具/API自动分析。

Java中的线程模型, 直接使用了操作系统的线程调度模型, 只进行简单的封装。

线程调用栈, 也称为方法调用栈。 比如在程序执行过程中, 有一连串的方法调用链:obj1.method2调用了obj2.methodB,obj2.methodB又调用了obj3.methodC。 每个线程的状态都可以通过这种调用栈来表示。

线程转储展示了各个线程的行为, 对于诊断和排查问题非常有用。

下面我们通过具体示例, 来演示各种获取Java线程转储的工具, 以及使用方法。

2. 使用JDK自带的工具

我们一般使用JDK自带的命令行工具来获取Java应用程序的线程转储。 这些工具都在JDK主目录的bin文件夹下。

所以, 只要配置好 PATH 路径即可。 如果不会配置, 可以参考:JDK环境准备

2.1 jstack 工具

jstack 是JDK内置的一款命令行工具, 专门用来查看线程状态, 也可以用来执行线程转储。

一般先通过jps或者ps命令找到Java进程对应的pid, 然后在控制台中通过pid来输出线程转储。 当然, 我们也可以将输出内容重定向到某个文件中。

使用jstack工具获取线程转储的基本参数格式为:

jstack [-F] [-l] [-m]

下面请看具体的演示:

# 1. 查看帮助信息

jstack -help

输出的内容类似于:

Usage:

jstack [-l]

(to connect to running process)

jstack -F [-m] [-l]

(to connect to a hung process)

jstack [-m] [-l]

(to connect to a core file)

jstack [-m] [-l] [server_id@]

(to connect to a remote debug server)

Options:

-F to force a thread dump. Use when jstack does not respond (process is hung)

-m to print both java and native frames (mixed mode)

-l long listing. Prints additional information about locks

-h or -help to print this help message

对应的参数选项是可选的。 具体含义如下:

-F选项, 强制执行线程转储; 有时候jstack pid会假死, 则可以加上-F标志

-l选项, 会查找堆内存中拥有的同步器以及资源锁

-m选项, 额外打印 native栈帧(C和C++的)

例如, 获取线程转储并将结果输出到文件:

jstack -F 17264 > /tmp/threaddump.txt

使用jps命令可以获取本地Java进程的 pid。

2.2 Java Mission Control

Java Mission Control(JMC)是一款客户端图形界面工具, 用于收集和分析Java应用程序的各种数据。

启动JMC后, 首先会显示本地计算机上运行的Java进程列表。 当然也可以通过JMC连接到远程Java进程。

可以鼠标右键单击对应的进程, 选择 “Start Flight Recording(开始飞行记录)” 。 结束之后, “Threads(线程)” 选项卡会显示“线程转储”:

2.3 jvisualvm

jvisualvm 是一款客户端图形界面工具, 既简单又实用, 可用来监控 Java应用程序, 对JVM进行故障排查和性能分析。

也可以用来获取线程转储。 鼠标右键单击Java进程, 选择“ Thread Dump”选项, 则可以创建线程转储, 完成后会在新选项卡中自动打开:

2.4 jcmd

jcmd工具本质上是向目标JVM发送一串命令。 尽管支持很多功能, 但不支持连接远程JVM - 只能在Java进程的本地机器上使用。

其中一个命令是Thread.print, 用来获取线程转储, 示例用法如下:

jcmd 17264 Thread.print

2.5 jconsole

jconsole 工具也可以查看线程栈跟踪。

打开jconsole并连接到正在运行的Java进程, 导航到“线程”选项卡, 可以查看每个线程的堆栈跟踪:

2.6 小结

事实证明, 可以使用JDK中的很多工具来获取线程转储。 让我们回顾一下, 并总结它们的优缺点:

jstack

jmc

jvisualvm

jcmd

jconsole

3. 使用Linux命令

在企业应用服务器中, 出于安全原因, 可能只安装了 JRE。 这时候没法使用这些JDK内置的工具。

但还是有办法获取线程转储。

3.1 使用kill -3指令

在Unix/Linux之类的系统中, 可以使用kill命令获取线程转储, 底层实现原理, 则是通过系统调用kill()将信号参数发送给进程。 这里需要发送的是-3信号。

一般先通过jps找到JAVA进程对应的pid,kill -3使用示例如下:

kill -3 17264

3.2Ctrl + Break(Windows)

在Windows操作系统的命令行窗口中, 可使用组合键Ctrl + Break来获取线程转储。 当然, 需要先导航至启动Java程序的控制台窗口, 然后同时按下CTRL键和Break键。

需要注意的是, 某些键盘是没有 “Break” 键的。

在这种情况下, 可以组合使用CTRL,SHIFT, 以及Pause键。

这两个命令都可以将线程转储打印到控制台。

4. 通过编程方式使用ThreadMxBean

JMX技术支持各种各样的花式操作。 可通过ThreadMxBean来执行线程转储。

示例代码如下:

private static String threadDump(boolean lockedMonitors, boolean lockedSynchronizers) {

StringBuffer threadDump = new StringBuffer(System.lineSeparator());

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();

for(ThreadInfo threadInfo : threadMXBean.dumpAllThreads(lockedMonitors, lockedSynchronizers)) {

threadDump.append(threadInfo.toString());

}

return threadDump.toString();

}

上面代码做的事情很简单, 先通过ManagementFactory获取ThreadMxBean对象。

方法的布尔参数lockedMonitors和lockedSynchronizers, 表示是否导出持有的同步器和管程锁。

5. 总结

我们通过具体示例展示了获取线程转储的各种方法。

首先介绍的是各种JDK内置工具,

然后讨论了命令行方式,

最后介绍了JMX编程的方式。

完整的示例代码请参考GitHub仓库。

到此这篇关于获取Java线程转储的常用方法的文章就介绍到这了,更多相关Java线程转储内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

java 线程转储_获取Java线程转储的常用方法(推荐)相关推荐

  1. java 线程 获取消息_获取java线程中信息

    怎样获取java线程中信息? 在进行多线程编程中,比较重要也是比较困难的一个操作就是如何获取线程中的信息.大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中,然后再提供一个获取方 ...

  2. jmc线程转储_如何分析线程转储– IBM VM

    jmc线程转储 本文是我们的线程转储分析系列的第4部分,它将为您提供什么是IBM VM的JVM线程转储以及您将找到的不同线程和数据点的概述. 您将看到和学习​​到,IBM VM Thread Dump ...

  3. java 线程开销_多线程的线程开销

    多线程中两个必要的开销:线程的创建.上下文切换 创建线程: 创建线程使用是直接向系统申请资源的,对操作系统来说,创建一个线程的代价是十分昂贵的, 需要给它分配内存.列入调度,同时在线程切换的时候还要执 ...

  4. java线程概念_《Java基础知识》Java线程的概念

    按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业生涯始终绕不过的坎,任何一个项目都或多或 ...

  5. java timer 线程安全_多线程之 线程安全与控制

    线程控制 wait和notify方法需要注意的细节:wait方法与notify方法必须要由同一个锁对象调用.因为:对应的锁对象可以通过notify唤醒使用同一个锁对 象调用的wait方法后的线程. w ...

  6. java 多线程状态_总结Java中线程的状态及多线程的实现方式

    线程的状态线程状态图: 说明: 线程共包括以下5种状态. 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪 ...

  7. java线程提交_从Java线程到线程池

    线程模型 线程模型分为两类,用户级线程(ULT)和内核级线程(KLT) 用户级线程(ULT):user level threads,系统内核对ULT无感知,线程的创建和调度都由用户级APP进程管理:即 ...

  8. java 线程状态_浅析Java中的线程状态

    一.线程的5种状态 众所周知,Java的线程状态有5种,分别对应上图中五种不同颜色,下面对这5种状态及状态间的转化做相应的解释: 1. 初始化状态:新建一个线程对象 2. 可运行状态:其他线程调用了该 ...

  9. Java 线程实例二(终止线程、生产者/消费者问题、获取线程状态、获取所有线程、查看线程优先级、中断线程)

    终止线程 Java中原来在Thread中提供了stop()方法来终止线程,但这个方法是不安全的,所以一般不建议使用. 本文向大家介绍使用interrupt方法中断线程. 使用interrupt方法来终 ...

最新文章

  1. java度量页面_JAVA Metrics 度量工具使用介绍1
  2. Spring Boot特性
  3. Entity Framework中IQueryable, IEnumerable, IList的区别(转自网络)
  4. 发一个统计项目代码行数的Java代码
  5. 【scala】集和映射
  6. 【面向对象】面向对象的分析与设计概述
  7. 【缅怀妈妈系列诗歌】之十三:妈妈,我接您回家
  8. 5000字彻底道尽「区块链分叉」真相!
  9. python while 循环 全局变量_python循环语句(while amp; for)
  10. 2023届计算机毕业设计源码
  11. Liferay layout_configuration 分析
  12. 前端vue经典面试题78道(重点详细简洁)
  13. UT000054: The maximum size 1048576 for an individual file in a multipart req
  14. 8月第1周基金排行榜 | TokenInsight
  15. UCLA教授朱松纯:走向通用人工智能,从大数据到大任务
  16. TGRS2022/遥感:An Empirical Study of Remote Sensing Pretraining遥感预训练的实证研究
  17. maven的依赖下载不下来,解决的几种方法(包括手动下载导入)
  18. audio type多种类型_使用tensorflow进行音乐类型的分类
  19. 3.1 TMO MATLAB 框架(Advanced High Dynamic Range Imaging )
  20. 06 方法定义及重载

热门文章

  1. python -m xxx.py和python xxx.py的区别
  2. html5 下拉刷新(pc+移动网页源码)
  3. hibernate基础工具findBySQL学习
  4. 用数据辅助设计-搜索中的实践
  5. Ext js call方法
  6. 高效的数据压缩编码方式 Protobuf
  7. 靠能力赚大钱,是最最可笑的谎言
  8. [JS性能优化专篇]
  9. XP系统安装SQL2000企业版开启1433端口
  10. Java多线程同步Synchronized使用分析