为何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时的火焰图

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

这一矛盾现象令人困惑: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
相关产品推荐
相关产品推荐

