我在 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/