You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何JDWP代理在压力测试中会引发大量deoptimization?

JDWP附加时JVM频繁反优化导致CPU占用过高的问题分析

问题现象

使用async-profiler进行压力测试并生成火焰图时发现:当附加JDWP调试器后,JVM会频繁出现deoptimization(反优化)现象,占用大量CPU时间。

附加JDWP时的火焰图

JDWP启动参数:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

附加JDWP时的火焰图

未附加JDWP时的火焰图

未附加JDWP时的火焰图

排查过程

  • 添加-XX:+PrintCompilation参数,仅观测到少量反优化日志
  • 使用JFR(Java Flight Recorder)分析,未捕获到任何反优化事件
    JFR无反优化事件截图

这一矛盾现象令人困惑:async-profiler明确显示反优化占用大量CPU,但JFR却无相关事件记录。

版本兼容性

该问题在Java 8和Java 17中均能复现:

> /Library/Java/JavaVirtualMachines/jdk-1.8.jdk/Contents/Home/bin/java -version
java version "1.8.0_371"
Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.371-b11, mixed mode)

> /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/bin/java -version
openjdk version "17.0.3" 2022-04-19 LTS
OpenJDK Runtime Environment Zulu17.34+19-CA (build 17.0.3+7-LTS)
OpenJDK 64-Bit Server VM Zulu17.34+19-CA (build 17.0.3+7-LTS, mixed mode, sharing)

补充线索

通过在OpenJDK邮件列表和bug库中搜索deoptimization关键词,找到两个类似的已上报案例:

  • Deoptimization taking up most CPU cycles
  • JDK-8243615: Continuous deoptimizations with Reason=unstable_if and Action=none

运行JDK-8243615提供的测试代码(未附加JDWP)时,成功复现了大量反优化的问题:

// javac UnstableIfTest.java
// java -XX:PerMethodRecompilationCutoff=4 UnstableIfTest
public class UnstableIfTest {
    static int compute(double x)
    {
        return (int) (Math.sin(x) + Math.cos(x));
    }
    static void hotMethod(int iteration)
    {
        if (iteration < 20) {
            compute(78.3);
        }
        else if (iteration < 40) {
            compute(78.3);
        }
        else if (iteration < 60) {
            compute(78.3);
        }
        else if (iteration < 80) {
            compute(78.3);
        } else if (iteration < 100) {
            compute(78.3);
        } else {
            compute(78.3);
        }
    }
    static void hotMethodWrapper(int iteration)
    {
        int count = 100_000;
        for (int i = 0; i < count; i++) {
            hotMethod(iteration);
        }
    }
    public static void main(String[] args)
    {
        for (int k = 0; k < 100; k++) {
            long start = System.nanoTime();
            hotMethodWrapper(k + 1);
            System.out.println("iteration " + k + ": " + (System.nanoTime() - start) / 1_000_000 + "ms");
        }
    }
}

测试代码复现问题的火焰图

猜测结论

JIT编译器可能存在bug,导致偶尔触发大量不必要的反优化操作,但目前尚未明确该bug与JDWP、async-profiler、JFR之间的具体关联机制。

内容的提问来源于stack exchange,提问作者zhumengzhu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:35:27