如何分析 Java 中的阻塞代码 – 测量执行时间而不是 CPU 时间

bol*_*lin 5 java profiling jfr

我正在尝试分析经常在数据库和休息调用中阻塞的情况。该代码不受 cpu 限制。以下示例 junit 方法应该可以说明该问题:

@RepeatedTest(10)
void fast() throws InterruptedException {
    Thread.sleep(100);
}

@RepeatedTest(10)
void slow() throws InterruptedException {
    // imagine a slow database or rest call or any other blocking code
    Thread.sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 IntelliJ 和 Java Flight Recorder。我预计该方法fast将使用大约 10% 的执行时间,而该方法slow将使用大约 90% 的执行时间。但它们根本没有被报告,因为它们不占用 CPU 时间。

如何分析实际执行时间(包括阻塞代码中的等待时间而不仅仅是 CPU 时间)?

Ing*_*gel 2

您需要一个能够理解 JDBC 和 HTTP 调用语义的探查器。例如,使用 JProfiler,分析代理会捕获当线程状态选择器设置为“所有状态”时包含的合成 Net I/O 线程状态。

在此输入图像描述

免责声明:我公司开发JProfiler