Java多线程编程实战指南:设计模式篇(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 对线程的监视

一个真实的Java系统运行时往往有上百个线程在运行,如果没有相应的工具对这些线程进行监视,那么这些线程对于我们来说就成了黑盒。而我们在开发过程中调试代码、定位问题,甚至定位线上环境(生产环境)中的问题时往往都需要将线程变为白盒,即我们需要知道系统中特定时刻存在哪些线程、这些线程处于什么状态,以及这些线程具体在做什么事情。

JDK自带的工具jvisualvm[8]可以实现对线程的监视,它适合在开发和测试环境下监视Java系统中的线程情况。图1-2展示了使用jvisualvm监视一个正在运行的Eclipse实例中的线程的情况,监视范围包括有哪些线程,以及这些线程的状态和调用栈。

图1-2 使用jvisualvm监视Java线程

当然,如果是线上环境,我们可能不便使用jvisualvm。此时可以使用JDK自带的另一个工具jstack[9]。jstack是一个命令行工具,通过它可以获取指定Java进程的线程信息。例如,假设某个正在运行的Eclipse实例对应的Java进程ID(PID)为11195,那么通过以下命令可以获取该Eclipse实例中的线程情况:

执行上述命令,部分输出如图1-3所示。

图1-3 使用jstack监视Java线程

在Java 8中,我们还可以使用Java Mission Control(JMC)工具来监视Java线程,如图1-4所示。

图1-4 使用JMC监视Java线程