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

Windows 11下Java 17编译器比Java 8慢50%,求问题原因与解决方法

Java 17嵌入式编译器在Windows 11上比Java 8慢50%的问题

测试环境

  • 系统:Windows 11(多台设备验证)
  • JDK 17版本:17.0.10
  • JDK 8版本:1.8.0.333
  • 备注:Linux系统下无此性能差异

问题背景

我在项目中通过ToolProvider.getSystemJavaCompiler()获取JDK嵌入式编译器,调用compiler.getStandardFileManager(..)获取标准文件管理器,发现Java 17的编译速度远慢于Java 8。由于项目需要编译大量复杂类,这种速度差异会影响业务效率。

为了复现问题,我制作了10个仅包含基本类型变量及set/get方法的简单Bean类(无依赖,可独立编译),并编写测试类循环逐个编译这些类。多次测试结果一致:Java 17的总编译时间比Java 8高约50%。

测试输出示例

JDK 17编译耗时

JDK 17 Compiling several classes using JavaCompiler directly
        compiling Alpha.java=322 ms
        compiling Beta.java=38 ms
        compiling Delta.java=34 ms
        compiling Epsilon.java=27 ms
        compiling Gamma.java=27 ms
        compiling Iota.java=25 ms
        compiling Lambda.java=23 ms
        compiling Phi.java=24 ms
        compiling Pi.java=25 ms
        compiling Zeta.java=19 ms
Total 564 ms

JDK 8编译耗时

JDK 8 Compiling several classes using JavaCompiler directly
        compiling Alpha.java=259 ms
        compiling Beta.java=15 ms
        compiling Delta.java=15 ms
        compiling Epsilon.java=14 ms
        compiling Gamma.java=15 ms
        compiling Iota.java=12 ms
        compiling Lambda.java=11 ms
        compiling Phi.java=13 ms
        compiling Pi.java=11 ms
        compiling Zeta.java=13 ms
Total 378 ms

测试类代码

public class CompileTest {

    public void doCompile() {
        FilenameFilter ff = new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.toLowerCase().endsWith(".java");
            }
        };
        System.err.println();
        System.err.println("JDK 8 Compiling several classes using JavaCompiler directly");
        JavaCompiler compiler=ToolProvider.getSystemJavaCompiler();
        StandardJavaFileManager fileManager=compiler.getStandardFileManager(null, Locale.getDefault(), Charset.forName("ISO-8859-1"));
        try {
            String sourceDir = "<source directory>";
            String[] classes = new File(sourceDir).list(ff);
            long total = 0;
            for (int i = 0; i < classes.length; i++) {
                String path = sourceDir+"\\"+classes[i];
                long t0 = System.currentTimeMillis();
                compile(compiler, fileManager, path);
                t0 = (System.currentTimeMillis()-t0);
                System.err.println("\tcompiling "+classes[i]+"="+t0+" ms");
                total+=t0;
            }
            System.err.println("Total "+total+" ms");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.err.println();        
    }

    private boolean compile(JavaCompiler compiler, StandardJavaFileManager fileManager, String toCompile) {
        List<String> plist = new ArrayList<>();
        PrintWriter pw=new PrintWriter(System.out);
        File javaFile = new File(toCompile);
        Iterable fileObjects=fileManager.getJavaFileObjects(javaFile);
        boolean ret=compiler.getTask(pw, fileManager, null, plist, null, fileObjects).call();
        return ret;
    }

    public static void main(String[] args) {
        CompileTest ct = new CompileTest();
        ct.doCompile();
    }

}

疑问

是否有其他人遇到过同样的问题?能否解释该性能差异的原因,或提供优化解决思路?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 07:50:54