个人技术分享

一、jstack 介绍和使用

jstack 是一个强大的命令行工具,用于分析 Java 应用程序的线程堆栈信息。下面是使用 jstack 的一些基本步骤和场景:

获取 Java 进程 ID

在使用 jstack 之前,你需要知道目标 Java 应用程序的进程 ID (PID)。在 Linux 或 macOS 系统中,可以使用 jps 命令来列出所有运行的 Java 进程,然后找到对应的应用程序。在 Windows 系统中,可以通过任务管理器或 tasklist 命令查找。

使用 jstack 命令

基本的命令格式如下:

jstack [-l] <pid>
  • <pid>:这是你想分析的 Java 进程的进程 ID。
  • -l(可选):使用长格式输出,提供额外的锁信息,有助于识别死锁情况。

示例

假设你的 Java 应用程序的进程 ID 是 12345,你可以这样使用 jstack

jstack 12345 > jstack_output.txt

这将会把线程堆栈跟踪信息输出到 jstack_output.txt 文件中,便于后续分析。

分析输出

jstack 输出的信息包含了每个线程的状态(如 RUNNABLE, WAITING, BLOCKED)、线程ID、线程名称以及每个线程当前调用堆栈的详细信息。通过分析这些信息,你可以:

  • 定位死锁:寻找处于 BLOCKED 状态且互相等待对方释放锁的线程。
  • 发现死循环:线程长时间处于 RUNNABLE 状态而没有进展可能意味着死循环。
  • 性能分析:识别哪些线程占用了 CPU 资源,通过堆栈跟踪查看它们在执行什么操作。
  • 资源等待:线程处于 WAITINGTIMED_WAITING 状态可能是因为在等待 I/O、条件变量或其他资源。

注意事项

  • 确保使用与目标 Java 应用程序兼容的 JDK 版本中的 jstack 工具。
  • 在某些情况下,如果目标 Java 进程权限受限,可能需要以 root 或相应管理员权限运行 jstack
  • 对于运行在 Docker 容器内的 Java 应用,可能需要先进入容器环境再执行 jstack

通过熟练运用 jstack,开发者可以有效地诊断和解决复杂的多线程问题。

jps 返回和使用示例

jps(Java Virtual Machine Process Status Tool)命令用于列出当前系统中所有运行的Java进程。当你在命令行中执行 jps 命令时,它将输出一系列正在运行的Java应用程序的进程ID(PID)以及这些进程的主类名。这个工具对于监控和管理Java应用非常有用,特别是当需要快速识别特定Java进程或者排查系统中运行的Java服务时。

以下是一个简单的示例输出,展示了 jps 命令可能返回的结果:

12345 org.springframework.boot.SpringApplication - TomcatWebServer
23456 com.example.MyApplication
34567 sun.tools.jps.Jps

在这个例子中:

  • 12345 是一个Spring Boot应用的进程ID,该应用的主类是 org.springframework.boot.SpringApplication,并且它使用了嵌入式的TomcatWebServer。
  • 23456 是另一个Java应用程序的进程ID,其主类为 com.example.MyApplication
  • 34567jps 命令本身的进程ID,显示了其主类为 sun.tools.jps.Jps,这是因为 jps 本身也是一个Java程序。

请注意,实际输出会根据你系统上运行的Java进程而有所不同。此外,jps 可能不会显示所有的Java进程,特别是那些使用非标准启动方式或者安全设置限制了访问的进程。