专栏首页九州牧云7 个抓取 Java Thread Dumps 的方式

7 个抓取 Java Thread Dumps 的方式

Thread dumps(线程转储)能帮助我们判断 CPU 峰值、死锁、内存异常、应用反应迟钝、响应时间变长和其他系统问题。一些在线的分析工具比如 http://fastthread.io/ 也能帮助我们分析和定位问题,但是这些工具都要求有一个 dump 文件。因此在这篇文章当中,我总结了7中抓取 Java Thread Dumps 文件的方式。

1. jstack

jstack 是一个抓取 thread dump 文件的有效的命令行工具,它位于 JDK 目录里的 bin 文件夹下(JDK_HOME\bin),以下是抓取 dump 文件的命令:

jstack -l  <pid> > <file-path>

说明:

  • pid: Java 应用的进程 id ,也就是需要抓取 dump 文件的应用进程 id。
  • file-path: 保存 dump 文件的路径。

示例:

jstack -l 37320 > /opt/tmp/threadDump.txt

上面的例子演示了用 jstack 生成 dump 文件到 /opt/tmp/threadDump.txt 目录下。

从 Java5 开始,jstack 被包含进了 jdk 当中,如果你使用老版本的 jdk,要考虑使用其他方式。

2. Kill -3

处于安全方面的考虑,有一部分生产环境的机器只包含 JRE 环境,因此就不能使用 jstack 工具了,在这种情况下,我们可以使用 kill -3 的方式:

kill -3 <pid>

说明:

  • pid: Java 应用的进程 id ,也就是需要抓取 dump 文件的应用进程 id 。

示例:

kill -3 37320

当使用 kill -3 生成 dump 文件时,dump 文件会被输出到标准错误流。假如你的应用运行在 tomcat 上,dump 内容将被发送到<TOMCAT_HOME>/logs/catalina.out 文件里。

3. JVisualVM

Java VisualVM 是一个可以提供 JVM 信息的图形界面工具。它位于 JDK_HOME\bin\jvisualvm.exe 文件里。从 JDK6 Update7 开始,它被包含进 JDK 里。

运行 jvisualvm,在左侧面板中(如下图所示),列出了运行的 JVM 信息,这个工具可以从本地或者远程运行的 JVM 里抓取 dump 文件。

点击上图的进程名称对应的 Thread Dump 按钮,将会生成 dump 文件,如下图所示:

4. JMC

Java Mission Control (JMC) 是一个能从本地或生产环境中收集和分析数据的工具,从 Oracle JDK 7 Update 40 开始,它被包含进 JDK 里,它可以从 JVM 里生成 dump 文件。JMC 位于 JDK_HOME\bin\jmc.exe 文件里:

运行该工具之后,你可以看到运行在本地的 Java 进程,它也可以连接到远程机器。双击你想要生成 dump 文件的 Java 进程,点击Flight Recorder,你会看到以下的对话框:

Thread Dump 下拉框,你可以选择生成 dump 文件的时间间隔。在上面的例子里,每隔60秒将会生成一个 dump 文件。选择完成之后启动 Flight recorder ,可以在 Threads 面板看到 dump 文件的内容:

5. Windows (Ctrl + Break)

这种方式仅仅在 Windows 操作系统上有效:

  • 在控制台窗口上选中命令行
  • 在命令行窗口上按 “Ctrl + Break” 命令

然后会生成 dump 文件,dump 文件的内容会被打印在命令行窗口上。

注意1: 有几款笔记本(比如 Lenovo T 系列)已经取消了 “Break” 键,在这种情况下你不得不用谷歌搜索与 Break 键功能类似的键,我发现 “Function key + B” 键与 Break 键的功能相同,因此我用 “Ctrl + Fn + B” 键来生成 dump 文件。

注意2: 用上述方式有一个缺点就是 dump 文件的内容会被打印到控制台上,没有 dump 文件的话,我们很难用分析工具比如http://fasthread.io来分析 dump 文件。因此你可以使用以下命令将 dump 文件的内容输出到文本文件当中,比如你的应用程序名字叫 SampleThreadProgram ,那么通常使用的命令如下:

java -classpath . SampleThreadProgram

将 dump 文件的内容输出到文本文件的命令如下:

java -classpath . SampleThreadProgram > C:\workspace\threadDump.txt 2>&1

当你按下 “Ctrl + Break” 键之后,dump 文件会被保存到 C:\workspace\threadDump.txt 里。

6. ThreadMXBean

从 JDK 1.5 开始,ThreadMXBean 被引入。这是 JVM 的管理接口,使用这个接口你仅需要少量的代码就能生成 dump 文件,以下是使用 ThreadMXBean 生成 dump 文件的主要实现:

public void  dumpThreadDump() {
   ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
   for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true)) {
       System.out.print(ti.toString());
   }
}

7. APM Tool – App Dynamics

一些应用性能监控工具提供了生成 dump 文件的功能,如果你使用 App Dynamics 监控你的应用,以下就是生成 dump 文件的步骤:

  1. 打开创建动作窗口,在创建动作窗口中选择 Diagnostics->Take a thread dump;
  2. 输入动作名称、抓取 dump 文件的数量、抓取 dump 文件的时间间隔(毫秒);
  3. 如果你想在抓取 dump 动作开始之前执行一些操作,那么你可以选中 Require approval executing before this Action 这个复选框,然后输入个人或小组的 email 地址;
  4. 点击 OK.

总结

尽管我在前面列出了7种抓取 dump 文件的方式,但恕我直言,jstackkill -3 是最好的选择,原因如下:

a. 简单,容易实现;

b. 通用:在大多数情况下,不管操作系统类型、Java 厂商、JVM 版本等等。

编译自:https://dzone.com/articles/how-to-take-thread-dumps-7-options

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL查看并修改当前数据库编码

    MySQL中,数据库的编码是一个相当重要的问题,有时候我们需要查看一下当前数据库的编码,甚至需要修改一下数据库编码。

    九州暮云
  • 加速你的Hibernate引擎(下)

    HQL看起来和SQL很相似。从HQL的WHERE子句中通常可以猜到相应的SQL WHERE子句。WHERE子句中的字段决定了数据库将选择的索引。

    九州暮云
  • linux服务器常用操作和命令

    1. 什么是linux服务器load average? Load是用来度量服务器工作量的大小,即计算机cpu任务执行队列的长度,值越大,表明包括正在运行和待运行...

    九州暮云
  • 一次 OOM 的问题

    最近在做服务作业的时候,突然发现机器的 dump 文件在暴增,1小时的执行下来,应用 _dump.log.* 文件达到了惊人的 20 个,其中每个dump 文件...

    haoming1100
  • 计算机中的dump到底是什么意思?

    一般指将数据导出、转存成文件或静态形式。比如可以理解成:把内存某一时刻的内容,dump(转存,导出,保存)成文件.

    JavaEdge
  • 海量数据迁移之分区表批量insert性能改进(r2笔记67天)

    在平时的工作中接触到的分区表一般都比较大,而且分区也少则几十,多则几百,上千。 在数据迁移的时候,分区表的迁移更是块大骨头,因为数据量太大,而且有些分区表中还有...

    jeanron100
  • 对于大数据大流量情况下微软架构的水平扩展的遐想(瞎想)

    最近回顾SAAS的书籍,书中的扩展架构都有点让我痴迷,但书中介绍的都是以Java,Apache,JBoss,Hadloop等技术实现负载均衡,大数据处理,对于微...

    脑洞的蜂蜜
  • 超车小米?新一代新经济独角兽比特大陆走“芯”上市

    不过这次,它不再只是“家里有矿”的矿机霸主,而是变身为AI芯片公司,开发用于云端训练及推断的高性能芯片。

    区块链领域
  • app微信支付(一) - 微信支付基本业务流程解析

    想必微信支付是现在很多朋友离不开的一个功能,不论是扫描支付还是公众号支付或者app端支付,基本的思路都是一样的,之前做过支付宝支付以及中国移动支付接口,这几天花...

    风间影月
  • python3 三种字符串(无前缀,前缀

    首先要明确,虽然有三种前缀(无前缀,前缀u,前缀b),但是字符串的类型只有两种(str,bytes),实验如下:

    py3study

扫码关注云+社区

领取腾讯云代金券