如何生成 thread dump

在分析应用响应变慢, CPU 使用率比较高, 死锁等问题时, thread dump 都非常有用. 那么怎么样才能获取一个Java 应用的 thread dump 呢?

  1. 如果有 JDK, 那么 JDK 再带的小工具能非常快的做出 thread dump.
    首先, 使用 JDK bin 目录下的 jps 命令, 能非常快的确认正在运行的 java 进程, 打印进程 id.

    33205 MyApp
    93946 Jps

    上面的输出当中, 93946是 jps 命令本身的进程 id, 因为它也是一个 java 进程;
    得到进程 ID 之后, 有下面这2种方法, 可以获取 thread dump:

    1. 使用 jstack 命令
      jstack -l >
      jstack -l 33205 > /tmp/threadDump.txt
    2. 使用 jcmd 命令
      jcmd Thread.print >
      jcmd 33205 Thread.print /tmp/threadDump.txt
  2. 在某些生产环境, 可能只安装 JRE, 没有安装 JDK, 那么可以使用 kill -3 命令, 给Java 进程发信号, 让它产生 thread dump.
  3. 如果你是在一个桌面系统, 可以使用JDK 自带的 GUI 工具: Java Mission Control 或者 JVisualVM.
  4. 如果想使用编程的方式, 可以使用 ThreadMXBean, 它能 dump 出 Java 进程的所有线程.
    ThreadMXBean threadMxBean = ManagementFactory.getThreadMXBean();
        for (ThreadInfo ti : threadMxBean.dumpAllThreads(true, true)) {
            System.out.print(ti.getThreadId());
            System.out.print(ti.getThreadName());
            System.out.print(ti.getThreadState());
            System.out.print(ti.getStackTrace());
            System.out.print(ti.getLockInfo());
        }
}
  1. 在某些 Windows 桌面环境, 如果你是通过命令行启动, 可以通过 Ctrl + Break 来生成 thread dump

标签: none

添加新评论