当前位置: 首页 > 面试题库 >

哪个Java线程在占用CPU?

郎嘉树
2023-03-14
问题内容

假设您的Java程序占用了100%的CPU。它有50个线程。您需要查找哪个线程有罪。我没有找到可以提供帮助的工具。当前,我使用以下非常耗时的例程:

  1. 运行jstack <pid>,其中pid是Java进程的进程ID。找到它的简单方法是运行JDK-中包含的另一个实用程序jps。最好将jstack的输出重定向到文件。
  2. 搜索“可运行”线程。跳过那些在套接字上等待的对象(由于某些原因,它们仍被标记为可运行)。
  3. 重复步骤1和2几次,看看是否可以找到图案。

或者,您可以在Eclipse中附加到Java进程,然后尝试一个一个地挂起线程,直到遇到占用CPU的线程。在单CPU机器上,您可能需要首先降低Java进程的优先级,以便能够四处移动。即使这样,由于超时,Eclipse通常也无法连接到正在运行的进程。

我本来希望Sun的visualvm工具能够做到这一点。

有人知道更好的方法吗?


问题答案:

尝试查看可视VM的Hot
Thread Detector插件

-它使用ThreadMXBean API提取多个CPU消耗样本来查找最活跃的线程。它基于来自Bruce
Chapman的等效命令行,

这也许也很有用。



 类似资料:
  • 我有一个Tomcat 9.0.60服务器,运行在Linux上的OpenJDK 1.8.0上,其中netstat-ltpn | grep java显示它侦听的端口不止配置的端口: (我从该列表中删除了所有配置的端口。) 因此,我认为有几个应用程序也打开了“他们自己的”套接字,他们听。我想找出每个端口的哪个Java线程正在侦听,这样我就可以进一步找出应用程序,也许它仍然是必需的,或者只是开发人员忘记的

  • java中一个普通线程需要多少内存。假设没有与之关联的对象。

  • 首先,我的问题是,为什么编译线程占用大量的CPU,以及如何最小化这一点,以便我们可以将CPU分配给其他线程。 提前感谢!

  • 当我研究线程及其占用的内存(线程堆栈)时,我决定做一个简单的负载测试,看看线程的数量如何影响我的计算机上的RAM。 所以,在测试中,我使用了Tomcat,在设置中。xml将最小和最大web容器线程池设置为200。在那之后,我在将pool设置为2000时也做了同样的操作。我很震惊,因为内存占用没有差异(通过Windows任务管理器进行检查),而且几乎是一样的。所以我认为这些线程可能必须处于运行状态,

  • 在阅读关于流的留档时,我遇到了以下句子: > 。。。试图从行为参数访问可变状态会给您带来错误的选择。。。如果您不同步对该状态的访问,您将面临数据竞争,因此您的代码将被破坏。。。[1] 如果行为参数确实有副作用。。。[没有]保证在同一个线程中执行同一流管道中“相同”元素上的不同操作。[2] 对于任何给定的元素,可以在库选择的任何时间和线程中执行该操作。[3] 这些句子没有区分顺序流和平行流。因此,我

  • 问题内容: 有没有办法找出我的Java线程在虚拟机中占用多少内存? 例如,使用堆栈跟踪转储或其他某种方式。 问题答案: Java线程将堆用作共享内存。各个线程都有其堆栈(您可以通过-Xss命令行选项设置其大小,默认为512KB),但是所有其他内存(堆)都不属于特定线程,并询问一个特定线程仅使用了多少内存没有道理。