专注Java教育14年 全国咨询/投诉热线:444-1124-454
星辉LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 告诉你在Java中如何查看线程数

告诉你在Java中如何查看线程数

更新时间:2022-12-08 10:33:34 来源:星辉 浏览1967次

1.概述

相信大家对线程的基本概念已经有所了解,用Java线程并发的基本单位。在大多数情况下,应用程序的吞吐量增加当创建多个线程并行任务。

然而,总有一个饱和点。毕竟,一个应用程序的吞吐量取决于CPU和内存资源。在一定限制,增加线程的数量会导致高内存,线程上下文切换等。

所以一个好的起点在故障诊断Java应用程序中的一个高端内存问题是监控线程的数量。在本教程中,我们将看看一些方式我们可以检查Java进程创建的线程的数量。

2.图形化Java监视工具

最简单的方式看到Java线程的数量是使用像Java VisualVM的图形工具。除了应用程序线程,Java VisualVM还列出了GC或任何其他线程所使用的应用程序(如JMX线程)。

此外,它还显示了诸如线程状态及其持续时间:

监控线程的数量是在Java VisualVM最基本的特征。一般来说,图形工具更先进,允许应用程序的实时监控。例如,Java VisualVM允许我们样品CPU堆栈跟踪,从而找到一个类或方法,可能会导致CPU瓶颈。

Java VisualVM分布与JDK安装在Windows机器上。应用程序部署在Linux上,我们需要连接到远程应用程序。这需要JMX VM参数。

因此,这些工具不会工作,如果一个应用程序已经运行没有这些参数。在后面的小节中,我们将看到如何使用命令行工具获得线程的数量。

3.Java api

在一些用例中,我们可以找到应用程序中线程的数量。例如,显示在日志监视仪表板或公开。

在这种情况下,我们依靠Java api的线程数。值得庆幸的是,有一个activeCount () API在线程类:

public class FindNumberofThreads {
    public static void main(String[] args) {
        System.out.println("Number of threads " + Thread.activeCount());
    }
}

和输出将会是:

Number of threads 2

值得注意的是,如果我们看到在Java VisualVM线程的数量,我们将会看到更多的相同的应用程序线程。这是因为activeCount()只返回线程的数量在同一ThreadGroup。Java的所有线程分为组织更容易管理。

在这个例子中,我们刚刚父ThreadGroup,即。主要:

public static void main(String[] args) {
    System.out.println("Current Thread Group - " + Thread.currentThread().getThreadGroup().getName());
}
Current Thread Group - main

如果有许多线程组在Java应用程序中,activeCount()不会给一个正确的输出。例如,它不会返回GC线程的数量。

在这样的场景中,我们可以使用JMX API:

public static void main(String[] args) {
    System.out.println("Total Number of threads " + ManagementFactory.getThreadMXBean().getThreadCount());
}

这个API返回总数从所有线程的线程组,GC, JMX,等等。

Total Number of threads 6

事实上,JMX图形工具如Java VisualVM使用相同的API的数据。

4.命令行工具

之前,我们讨论了Java VisualVM,图形分析住线程在一个应用程序的工具。虽然生活的可视化线程是一个伟大的工具,它有一个小的影响应用程序的性能。因此不建议用于生产环境。

此外,正如我们之前所讨论的,在Linux中Java VisualVM需要远程连接。事实上,在某些情况下,它需要额外的配置。例如,一个应用程序运行在一个码头工人或Kubernetes需要额外的服务和端口配置。

在这种情况下,我们必须依靠命令行工具在主机环境中线程数。

幸运的是,Java提供一些命令线程转储。我们可以分析一个线程转储为一个文本文件或使用一个线程dump analyzer工具检查线程的数量以及它们的状态。

阿里巴巴阿尔萨斯是另一个伟大的command-l

top -H -p 1

这里,- h是一个命令行选项来显示每个线程在一个Java进程。如果没有这个标志,上面的命令将显示进程中的所有线程的综合统计。- p选项过滤器的输出目标应用程序的进程id:

top - 15:59:44 up 7 days, 19:23,  0 users,  load average: 0.52, 0.41, 0.36
Threads:  37 total,   0 running,  37 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.2 us,  2.2 sy,  0.0 ni, 93.4 id,  0.8 wa,  0.0 hi,  0.3 si,  0.0 st
MiB Mem :   1989.2 total,    110.2 free,   1183.1 used,    695.8 buff/cache
MiB Swap:   1024.0 total,    993.0 free,     31.0 used.    838.8 avail Mem
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   1 flink     20   0 2612160 304084  29784 S   0.0  14.9   0:00.07 java
  275 flink     20   0 2612160 304084  29784 S   0.0  14.9   0:02.87 java
  276 flink     20   0 2612160 304084  29784 S   0.0  14.9   0:00.37 VM Thread
  277 flink     20   0 2612160 304084  29784 S   0.0  14.9   0:00.00 Reference Handl
  278 flink     20   0 2612160 304084  29784 S   0.0  14.9   0:00.00 Finalizer
  279 flink     20   0 2612160 304084  29784 S   0.0  14.9   0:00.00 Signal Dispatch

如上图所示,它显示了线程id,即。、PID和线程的CPU和内存使用率。类似于Java VisualVM,顶部命令将列出所有线程,包括GC, JMX或任何其他子流程。

发现我们使用的进程ID作为参数在上面的命令中,我们可以使用ps命令:

ps -ef | grep java

事实上,我们可以使用ps命令来列出线程:

ps -e -T | grep 1

t选项告诉ps命令列出所有线程开始由应用程序:

1     1 ?        00:00:00 java
1   275 ?        00:00:02 java
1   276 ?        00:00:00 VM Thread
1   277 ?        00:00:00 Reference Handl
1   278 ?        00:00:00 Finalizer
1   279 ?        00:00:00 Signal Dispatch
1   280 ?        00:00:03 C2 CompilerThre
1   281 ?        00:00:01 C1 CompilerThre

在这里,第一列是PID,第二列显示了每个线程Linux线程ID。

5. 结论

在本文中,我们发现我们有许多方式可以找到Java应用程序线程的数量。在大多数情况下,使用命令行选项像顶部或ps命令应该是首选的方法。

然而,在某些情况下,我们可能还需要图形工具如Java VisualVM。所有示例代码都可以在GitHub。以上就是星辉小编介绍的"告诉你在Java中如何查看线程数",希望对大家有帮助,想了解更多可查看Java多线程编程技术文档。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>