java - 我如何检测我的方法在等待什么?

标签 java multithreading profiler

我在 Java 中有一个方法可以调用其他几个方法。在固定线程池中从多个线程调用此方法。工作人员的数量与可用处理器(核心)的数量相同。

public void query() {
    method1();
    method2();
}

当我使用 VisualVM 分析程序执行时,method1()method2() 时间非常短,但是 query() 自拍时间很长。但是该方法除了两次调用之外没有其他代码。 method1()method2() 中可能存在同步,但在我可以控制的代码中没有明显的同步。

当我将池中的 worker 数减少到 1 时,这个 self 时间几乎没有了。整个程序的单线程和多线程执行时间几乎是一样的。我认为这意味着我的方法 query() 正在等待某事。

没有死锁,执行完成。 method1()method2() 这两个方法调用了很多其他东西,包括混淆后的 jar 中的库类,所以我调试起来并不容易。然而,query() 方法是使用 java.util.concurrent.ExecutorService 直接从工作线程调用的。

最佳答案

对正在运行的进程发出级别 3 的 kill 命令。所有线程都将堆栈跟踪转储到标准输出,应用程序将继续运行。

kill -3 <pid>

请注意,您不会在发出 kill 命令的控制台上看到任何内容。 Java 应用程序本身将具有输出。您可能需要检查日志,具体取决于应用重定向其输出的位置。

关于java - 我如何检测我的方法在等待什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29747345/

相关文章:

node.js - 我如何为 npm 安装计时?

android - 与 Nvidia Tegra profiler 2.0 兼容的移动设备

profiler - 是否有任何可用的处理程序分析器?

java - 如何 "program"一个可以容纳多种类型元素的包?

java - 为什么我的函数会出现无限循环?

java - 多个服务器同时也是客户端 - JAVA 中的通信

具有消费者完成通知的 Java 生产者消费者模式

java定时器定时任务

java - 如何以编程方式关闭 4G/数据?

c++ - std::async 中的奇怪行为