【问题标题】:Finding Source of Thread Creation in a Java application在 Java 应用程序中查找线程创建的来源
【发布时间】:2012-05-20 07:52:24
【问题描述】:

我正在开发一个存在线程问题的 Java 应用程序。

在使用附加了 Netbeans 分析器的应用程序一段时间后,我可以看到创建了几个线程。他们中的大多数以.5 seconds 结尾。我只能找到应用程序中使用的 SwingWorkers。

此外,分析器显示的大多数线程都是普通线程,而不是 SwingWorkers。除非这些线程是由 SwingWorker 间接创建的,否则我怀疑应用程序使用的某个库正在创建它们。

现在我想删除这个问题。但是我找不到确定线程创建来源的方法。如果可以请建议一些其他分析器/工具,我可以通过它们找到线程创建的来源(方法)。

【问题讨论】:

  • 您是否考虑过在线程的构造函数中获取[当前堆栈跟踪][1]? [1]:stackoverflow.com/questions/1069066/…
  • @OldCurmudgeon 我只看到分析器结果中的线程,我不知道线程是在何时何地创建的。因此,我认为我现在不能使用它。但是,一旦我使用了下面列出的分析器,如果需要,我可能会在某些本地化情况下使用它。感谢您的链接
  • JDK Flight Recorder(以前称为 Java Flight Recorder,自 Java 11 起作为 OpenJDK 的一部分免费提供)应该能够捕获堆栈跟踪线程创建。

标签: java multithreading profiling


【解决方案1】:

如果可以选择使用 Eclipse 及其调试器,您可以尝试以下方法:

  • 将代码导入 Java 项目。
  • Ctrl-Shift-T(打开类型),输入“线程”。 Thread 类的二进制源代码编辑器打开。
  • 在大纲视图中选择所有线程构造函数,使用上下文菜单“切换方法断点”。这会为构造函数创建断点。
  • 运行和调试。

或者

您可以获得Yourkit Java profiler,它也可用于评估。它可以显示在应用程序中创建的线程,包括它们的堆栈跟踪(也在线程完成之后)。它没有显示线程的创建位置,但线程的堆栈跟踪可能会为您提供有关所涉及库的一些线索。

【讨论】:

  • 哇,这是一个很好的答案,这也教如何正确使用 Eclipse,以及它的用途。
【解决方案2】:

JProfiler 可以做到这一点。线程监视器视图显示创建线程的堆栈跟踪 - 如果当时 CPU 记录处于活动状态:

免责声明:我公司开发JProfiler

【讨论】:

  • Mhh... 我只是想在 JProfiler 10.1.5 中使用此功能,但堆栈跟踪与创建线程的位置完全无关。我得到了像ClassLoader.loadClass(String) 这样的方法,或者没有对线程做任何事情的方法。看起来这个功能现在在 JProfiler 中有点坏了。 :/ 我终于找到了正确的位置,在Thread.start 中创建了一个断点,条件是检查线程的名称。
  • 显示的堆栈跟踪仅显示已分析的类。要显示所有类,请使用采样并在分析设置中禁用所有调用树过滤器。
  • 我仍然得到与创建线程的位置无关的随机结果。如果我使用仪器而不是采样,它似乎可以通过。
猜你喜欢
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多