IDEA Java编译慢主要因默认串行编译、堆内存不足(默认700MB)、注解处理器串行执行、资源文件变更触发全量编译所致;开启并行编译、增大-Xmx、关闭冗余APT、隔离配置文件可显著提速。

IDEA里Java编译慢,先看是不是用了默认的串行编译
IntelliJ IDEA 默认用的是 javac 串行编译,尤其在模块多、依赖深的项目里,哪怕改一行代码也要等好几秒。这不是你机器差,是编译器没被“叫醒”。
开启并行编译能直接让编译时间下降 30%~60%,前提是项目没写死单线程逻辑(比如某些自定义注解处理器强行同步)。
- 进
Settings > Build > Compiler > Java Compiler,把Use compiler改成javac(别选ECJ,它不支持并行) - 勾选
Parallel compilation—— 这个开关控制是否让javac启用-J-XX:ParallelGCThreads之外的并行任务调度 - 确认
Project bytecode version和模块的Language level一致,否则 IDEA 会退回到安全但慢的兼容模式
堆内存不够,javac 自己先卡住
IDEA 内置的编译器运行在独立 JVM 上,默认只给 700MB 堆,大项目一编译就频繁 GC,看着进度条不动其实是 GC 暂停。不是 CPU 满了,是内存反复回收腾不出空间。
这个 JVM 和你项目运行时的 VM options 无关,得单独调。
- 编辑
idea.vmoptions(macOS 在Contents/bin/idea.vmoptions;Windows 在安装目录bin/idea64.exe.vmoptions) - 加大
-Xmx,建议设为物理内存的 1/4~1/3,比如 16GB 内存可设-Xmx4g;别超-Xmx8g,过大反而触发 CMS 或 ZGC 的额外开销 - 加
-XX:ReservedCodeCacheSize=512m,避免注解处理器动态生成字节码时 CodeCache 溢出报java.lang.OutOfMemoryError: Compressed class space
annotationProcessor 是编译变慢的隐形推手
像 Lombok、MapStruct、Dagger 这类注解处理器,会在编译期扫描整个 classpath,如果没配排除规则,连 test 目录、未启用的 profile 配置类都会被加载分析。一个 @Mapper 可能触发几百个类的反射检查。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
它们不走并行编译路径,而是串行执行,且无法被 Parallel compilation 开关加速。
- 在
build.gradle里显式关闭不用的 APT:比如compileOnly 'org.projectlombok:lombok'+annotationProcessor 'org.projectlombok:lombok',别用implementation引入 - Gradle 用户加
options.compilerArgs += ['-Adagger.fastInitEnabled=true'](对 Dagger 2.40+),跳过部分初始化扫描 - 检查
Settings > Build > Compiler > Annotation Processors是否勾选了Obtain processors from project classpath——如果用了 Gradle/Maven 管理 APT,这里要关掉,否则 IDEA 会重复加载
增量编译失效?可能是资源文件或配置触发全量
IDEA 的增量编译(Make)本该只编译改动的 .java,但一旦检测到 resources 目录下有变化(比如 application.yml 被保存),或者 META-INF/MANIFEST.MF 时间戳更新,就会自动 fallback 到全量编译 —— 你根本没意识到它已经“重来一遍”了。
这种行为不可关闭,但可以绕过。
- 把非代码类配置移到
src/main/profiles/下,用 Spring Boot 的--spring.config.location指定,避开 resources 扫描 - 禁用 IDEA 对资源文件的自动编译:取消勾选
Settings > Build > Compiler > Build project automatically,改用手动Ctrl+F9(或Cmd+F9),它比自动触发更可控 - 检查是否有插件监听文件变更(如 Properties to YAML Converter),这类插件保存即重写文件,等于每改一次就骗 IDEA “资源变了”
真正影响编译速度的,往往不是核心参数,而是这些看似无关的耦合点:一个配置文件的保存动作、一个没关的注解处理器、甚至是你改完代码顺手格式化了一下 YAML —— 它们不会报错,但会让编译从 800ms 拉长到 4s。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










