Linux Java编译速度优化清单
并行与缓存优先
- 并行构建:充分利用多核,使用make -j$(nproc)(或按核心数设置如**-j4**);Gradle 使用**–parallel并配置合理的org.gradle.workers.max**;Maven 启用**-T 1C或-T 4**等并行参数。
- 构建缓存:Gradle 开启**–build-cache与–scan定位瓶颈;Maven 使用maven-build-cache-plugin或ccache-javac**包装器;重复本地构建收益显著。
- 增量与避免全量:优先增量编译;清理时避免无意义的clean(如 Gradle 使用**–no-daemon**仅在必要时重启守护进程)。
JDK与工具链优化
- 选择合适 JDK:日常开发与编译建议使用JDK 17/21 LTS的Eclipse Temurin/OpenJDK构建;如使用jlink裁剪运行时,仅保留必要模块以减少依赖解析与类路径扫描开销。
- 工具链与诊断:确保javac与jdk.compiler来自同一 JDK;升级到较新的Gradle/Maven版本获取更好的增量与缓存策略;按需使用jdeps分析依赖,减少编译期类路径膨胀。
构建配置与依赖管理
- 依赖收敛:统一依赖版本,避免同一坐标的多版本并存;使用BOM或集中依赖管理;定期执行dependency:analyze清理无用依赖。
- 减少编译范围:将test与main分离构建;对不需要参与编译的模块使用provided或compileOnly;通过sourceSets仅编译变更模块。
- 注解处理器与编译器插件:仅在需要时启用注解处理器;避免重复执行代价高的 APT(如统一在compileJava阶段执行,避免在testCompileJava重复)。
- 资源与 I/O:将src/main/resources中体积大的文件拆分或外部化;避免频繁生成/删除大量小文件(合并、压缩或改为运行时下载)。
Linux系统层面优化
- I/O 与文件系统:使用SSD/NVMe;确保**/tmp与构建目录位于高速盘;挂载时使用noatime**降低元数据写入;避免跨网络文件系统(NFS)进行频繁构建。
- 内存与调度:适度提高vm.swappiness可能导致抖动,建议保持较低值(如 10–30)并预留足够内存以减少 swap;使用ionice -c 2 -n 7降低构建 I/O 优先级,避免影响前台业务。
- 并行与监控:持续观察CPU 利用率、I/O 等待、内存占用;在 CI 中固定**–max-workers避免资源争用;必要时使用tmpfs作为Gradle 缓存目录**(注意内存压力)。
快速落地脚本与参数示例
- Gradle(单模块/多模块通用)
- 并行与缓存:
- ./gradlew build --parallel --build-cache --max-workers=$(nproc)
- 仅变更模块:./gradlew :core:compileJava --build-cache
- 诊断与优化:
- ./gradlew build --scan 查看瓶颈与缓存命中
- 使用jdeps精简依赖:jdeps --class-path ‘libs/*’ app.jar
- Maven
- 并行与缓存:
- mvn -T 1C clean package -Dmaven.test.skip=true
- 使用构建缓存插件(如 maven-build-cache-plugin)并配置远程缓存仓库
- Make(OpenJDK 或本地自建工程)
- 并行与配置:
- make -j**$(nproc)** CONF=linux-x86_64-normal-server-fastdebug
- 多版本 JDK 切换:使用update-alternatives管理 java/javac 版本
- 系统侧(可选)
- 挂载优化:mount -o remount,noatime /build
- I/O 优先级:ionice -c 2 -n 7 ./gradlew build
以上步骤按“低成本到高成本、见效快到见效慢”的顺序实施,通常能在不改变代码的前提下获得显著提速,并具备良好的可维护性。